Skip to content

Commit 210c98f

Browse files
committed
Update Java Notes
1 parent 84fad7f commit 210c98f

File tree

4 files changed

+28
-66
lines changed

4 files changed

+28
-66
lines changed

DB.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2432,7 +2432,7 @@ CREATE TABLE us_pro(
24322432
工作原理:
24332433

24342434
* 自动提交模式下,如果没有 start transaction 显式地开始一个事务,那么**每个 SQL 语句都会被当做一个事务执行提交操作**
2435-
* 手动提交模式下,所有的 SQL 语句都在一个事务中,直到执行了 commit 或 rollback,该事务结束的同时开启另外一个事务
2435+
* 手动提交模式下,所有的 SQL 语句都在一个事务中,直到执行了 commit 或 rollback
24362436

24372437
* 存在一些特殊的命令,在事务中执行了这些命令会马上强制执行 COMMIT 提交事务,如 DDL 语句 (create/drop/alter/table)、lock tables 语句等
24382438

Java.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4415,11 +4415,11 @@ TreeSet 集合自排序的方式:
44154415
* 直接为**对象的类**实现比较器规则接口 Comparable,重写比较方法:
44164416

44174417
方法:`public int compareTo(Employee o): this 是比较者, o 是被比较者`
4418-
4418+
44194419
* 比较者大于被比较者,返回正数(升序)
44204420
* 比较者小于被比较者,返回负数
44214421
* 比较者等于被比较者,返回 0
4422-
4422+
44234423
* 直接为**集合**设置比较器 Comparator 对象,重写比较方法:
44244424

44254425
方法:`public int compare(Employee o1, Employee o2): o1 比较者, o2 被比较者`
@@ -4489,7 +4489,7 @@ PriorityQueue 是优先级队列,底层存储结构为 Object[],默认实现
44894489

44904490
常用 API:
44914491

4492-
* `public boolean offer(E e)`:将指定的元素插入到此优先级队列中**尾部**
4492+
* `public boolean offer(E e)`:将指定的元素插入到此优先级队列的**尾部**
44934493
* `public E poll() `:检索并删除此队列的**头元素**,如果此队列为空,则返回 null
44944494
* `public E peek()`:检索但不删除此队列的头,如果此队列为空,则返回 null
44954495
* `public boolean remove(Object o)`:从该队列中删除指定元素(如果存在),删除元素 e 使用 o.equals(e) 比较,如果队列包含多个这样的元素,删除第一个
@@ -6671,7 +6671,7 @@ public class MethodDemo{
66716671
public static void main(String[] args) {
66726672
String[] strs = new String[]{"James", "AA", "John",
66736673
"Patricia","Dlei" , "Robert","Boom", "Cao" ,"black" ,
6674-
"Michael", "Linda","cao","after","sBBB"};
6674+
"Michael", "Linda","cao","after","sa"};
66756675

66766676
// public static <T> void sort(T[] a, Comparator<? super T> c)
66776677
// 需求:按照元素的首字符(忽略大小写)升序排序!!!

Prog.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3812,8 +3812,8 @@ JDK8 以前:每个 ThreadLocal 都创建一个 Map,然后用线程作为 Map
38123812

38133813
JDK8 以后:每个 Thread 维护一个 ThreadLocalMap,这个 Map 的 key 是 ThreadLocal 实例本身,value 是真正要存储的值
38143814

3815-
* 每个 Thread 线程内部都有一个 Map (ThreadLocalMap)
3816-
* Map 里面存储 ThreadLocal 对象(key)和线程的变量副本(value)
3815+
* **每个 Thread 线程内部都有一个 Map (ThreadLocalMap)**
3816+
* Map 里面存储 ThreadLocal 对象(key)和线程的私有变量(value)
38173817
* Thread 内部的 Map 是由 ThreadLocal 维护的,由 ThreadLocal 负责向 map 获取和设置线程的变量值
38183818
* 对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成副本的隔离,互不干扰
38193819

@@ -4589,8 +4589,8 @@ java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现:**FIFO
45894589

45904590
| 方法类型 | 抛出异常 | 特殊值 | 阻塞 | 超时 |
45914591
| ---------------- | --------- | -------- | ------ | ------------------ |
4592-
| 插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
4593-
| 移除 | remove() | poll() | take() | poll(time,unit) |
4592+
| 插入(尾) | add(e) | offer(e) | put(e) | offer(e,time,unit) |
4593+
| 移除(头) | remove() | poll() | take() | poll(time,unit) |
45944594
| 检查(队首元素) | element() | peek() | 不可用 | 不可用 |
45954595

45964596
* 抛出异常组:

SSM.md

Lines changed: 19 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -6755,8 +6755,13 @@ MySQL InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(
67556755
**支持当前事务**的情况:
67566756

67576757
* TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则**加入该事务**;如果当前没有事务,则创建一个新的事务
6758-
* 内外层是相同的事务
6759-
* 在 aMethod 或者在 bMethod 内的任何地方出现异常,事务都会被回滚
6758+
* 内外层是相同的事务,在 aMethod 或者在 bMethod 内的任何地方出现异常,事务都会被回滚
6759+
* 工作流程:
6760+
* 线程执行到 serviceA.aMethod() 时,其实是执行的代理 serviceA 对象的 aMethod
6761+
* 首先执行事务增强器逻辑(环绕增强),提取事务标签属性,检查当前线程是否绑定 connection 数据库连接资源,没有就调用 datasource.getConnection(),设置事务提交为手动提交 autocommit(false)
6762+
* 执行其他增强器的逻辑,然后调用 target 的目标方法 aMethod() 方法,进入 serviceB 的逻辑
6763+
* serviceB 也是先执行事务增强器的逻辑,提取事务标签属性,但此时会检查到线程绑定了 connection,检查注解的传播属性,所以调用 DataSourceUtils.getConnection(datasource) 共享该连接资源,执行完相关的增强和 SQL 后,发现事务并不是当前方法开启的,可以直接返回上层
6764+
* serviceA.aMethod() 继续执行,执行完增强后进行提交事务或回滚事务
67606765
* TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则**加入该事务**;如果当前没有事务,则以非事务的方式继续运行
67616766
* TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则**加入该事务**;如果当前没有事务,则抛出异常
67626767

@@ -9144,6 +9149,18 @@ retVal = invocation.proceed():**拦截器链驱动方法**
91449149

91459150

91469151

9152+
***
9153+
9154+
9155+
9156+
### 事务
9157+
9158+
9159+
9160+
9161+
9162+
9163+
91479164
***
91489165

91499166

@@ -9239,62 +9256,7 @@ AutowiredAnnotationBeanPostProcessor 间接实现 InstantiationAwareBeanPostProc
92399256

92409257

92419258

9242-
***
9243-
9244-
9245-
9246-
#### Transaction
9247-
9248-
@EnableTransactionManagement 导入 TransactionManagementConfigurationSelector,该类给 Spring 容器中两个组件:
9249-
9250-
* AdviceMode 为 PROXY:导入 AutoProxyRegistrar 和 ProxyTransactionManagementConfiguration(默认)
9251-
* AdviceMode 为 ASPECTJ:导入 AspectJTransactionManagementConfiguration(与声明式事务无关)
9252-
9253-
AutoProxyRegistrar:给容器中注册 InfrastructureAdvisorAutoProxyCreator,**利用后置处理器机制拦截 bean 以后包装并返回一个代理对象**,代理对象中保存所有的拦截器,利用拦截器的链式机制依次进入每一个拦截器中进行拦截执行(就是 AOP 原理)
9254-
9255-
ProxyTransactionManagementConfiguration:是一个 Spring 的事务配置类,注册了三个 Bean:
92569259

9257-
* BeanFactoryTransactionAttributeSourceAdvisor:事务增强器,利用注解 @Bean 把该类注入到容器中,该增强器有两个字段:
9258-
9259-
* TransactionAttributeSource:解析事务注解的相关信息,比如 @Transactional 注解,该类的真实类型是 AnnotationTransactionAttributeSource,构造方法中注册了三个**注解解析器**,解析三种类型的事务注解 Spring、JTA、Ejb3
9260-
9261-
* TransactionInterceptor:**事务拦截器**,代理对象执行拦截器方法时,会调用 TransactionInterceptor 的 invoke 方法,底层调用TransactionAspectSupport.invokeWithinTransaction(),通过 PlatformTransactionManager 控制着事务的提交和回滚,所以事务的底层原理就是通过 AOP 动态织入,进行事务开启和提交
9262-
9263-
```java
9264-
// 创建平台事务管理器对象
9265-
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
9266-
// 开启事务
9267-
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
9268-
// 执行目标方法(方法引用方式,invocation::proceed,还是调用 proceed)
9269-
retVal = invocation.proceedWithInvocation();
9270-
// 提交或者回滚事务
9271-
commitTransactionAfterReturning(txInfo);
9272-
```
9273-
9274-
`createTransactionIfNecessary(tm, txAttr, joinpointIdentification)`:
9275-
9276-
* `status = tm.getTransaction(txAttr)`:获取事务状态,开启事务
9277-
9278-
* `doBegin`: **调用 Connection 的 setAutoCommit(false) 开启事务**,就是 JDBC 原生的方式
9279-
9280-
* `prepareTransactionInfo(tm, txAttr, joinpointIdentification, status)`:准备事务信息
9281-
9282-
* `bindToThread() `:利用 ThreadLocal **把当前事务绑定到当前线程**(一个线程对应一个事务)
9283-
9284-
策略模式(Strategy Pattern):使用不同策略的对象实现不同的行为方式,策略对象的变化导致行为的变化,事务也是这种模式,每个事务对应一个新的 connection 对象
9285-
9286-
`commitTransactionAfterReturning(txInfo)`:
9287-
9288-
* `txInfo.getTransactionManager().commit(txInfo.getTransactionStatus())`:通过平台事务管理器操作事务
9289-
9290-
* `processRollback(defStatus, false)`:回滚事务,和提交逻辑一样
9291-
9292-
* `processCommit(defStatus)`:提交事务,调用 doCommit(status)
9293-
9294-
* `Connection con = txObject.getConnectionHolder().getConnection()`:获取当前线程的连接对象
9295-
* `con.commit()`:事务提交,JDBC 原生的方式
9296-
9297-
92989260

92999261

93009262

0 commit comments

Comments
 (0)