聊聊 ReentrantLock 吧
ReentrantLock 意为「可重入锁」,说起 ReentrantLock 就不得不说 AQS ,因为其底层就是「使用 AQS 去实现」的。
ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。
-
公平模式下等待线程入队列后会严格按照队列顺序去执行
-
非公平模式下等待线程入队列后有可能会出现插队情况
「公平锁」
-
第一步:「获取状态的 state 的值」
-
如果 state=0 即代表锁没有被其它线程占用,执行第二步。
-
如果 state!=0 则代表锁正在被其它线程占用,执行第三步。
-
-
第二步:「判断队列中是否有线程在排队等待」
-
如果不存在则直接将锁的所有者设置成当前线程,且更新状态 state 。
-
如果存在就入队。
-
-
第三步:「判断锁的所有者是不是当前线程」
-
如果是则更新状态 state 的值。
-
如果不是,线程进入队列排队等待。
-
「非公平锁」
-
获取状态的 state 的值
-
如果 state=0 即代表锁没有被其它线程占用,则设置当前锁的持有者为当前线程,该操作用 CAS 完成。
-
如果不为0或者设置失败,代表锁被占用进行下一步。
-
-
此时「获取 state 的值」
-
如果是,则给state+1,获取锁
-
如果不是,则进入队列等待
-
如果是0,代表刚好线程释放了锁,此时将锁的持有者设为自己
-
如果不是0,则查看线程持有者是不是自己
-