1. 内存屏障
读屏障
与写屏障
组成的四大屏障
2、AQS
抽象队列同步器。起内部有个tryAcquire()
方法来获取锁
架构
2.1 ReentrantLock
AQS实现之一。
模型图:
-
重要的两个构造:
NonfairSyc
与FairSync
是继承了Sync
的类。 -
ReentrantLock
其内部的Sync
属性(静态内部类)就是实现了AQS
的。
2.1.2 lock的时候
-
使用
ReentrantLock
执行lock()
方法时会执行到Sync
内部的抽象lock()
方法。其具体实现在FairSync
与NonFairSync
中,最终都会调用到acquire()
方法,这个acquire()
方法在AQS中。
注意:在非公平锁中,如果是第一个线程的话,就不会去执行acquire()
,也就是说,获取到了锁就不会去执行。
-
公平锁与非公平锁尝试获取锁时:
①:公平锁在尝试获取锁时,会去判断前面是否有排队的线程。
②:在如下代码中,else if
同时也体现了可重入锁的思想。
总结:执行lock()
方法时
- 根据公平与非公平,执行逻辑不一样,但是之后都会在执行到
acquire()
- 在
acquire()
方法中(在AQS中),会执行tryAcquire()
去获取锁,获取不到就会执行到LockSupport.park(this)
将当前线程挂起。 - 获取到了锁就回去改变
state
的值
2.1.2 unlock的时候
ReentrantLock.unlock
实际上是通过Sync
去执行AQS
中的release()
方法- 在用
AQS
执行release()
时,- 先去
tryRelease()
,这个用的其中的Sync
类实现的release方法
,也就是说没有区分公平与否。这个方法会把AQS中标识的当前独占线程的标识设置为空exclusiveOwnerThread
tryRelease()
成功,后续再判断,然后会执行unparkSuccessor()
去unpark
下一个线程。
- 先去
AQS中的静态内部类Node
示意图