Java并发之ReentrantLock类源码解析
reentrantlock内部由sync类实例实现。
sync类定义于reentrantlock内部。
sync继承于abstractqueuedsynchronizer。
abstractqueuedsynchronizer继承于abstractownablesynchronizer。
abstractownablesynchronizer类中只定义了一个exclusiveownerthread变量,表示当前拥有的线程。
除了sync类,reentrantlock内部还定义了两个实现类。
nonfairsync是非公平锁。fairsync 是公平锁。
reentrantlock两个构造方法如下:
reentrantlock的lock方法
非公平锁的lock方法
compareandsetstate方法是一个cas方法。该方法尝试去更新对象内的一个变量。变量期望是0,更新为1。
若更新成功,则将exclusiveownerthread变量设置为当前线程。然后lock方法会立刻返回。
若更新不成功,则调用acquire(1)。
acquire方法中首先调用tryacquire()再次尝试更新。
非公平锁的tryacquire()方法如下:
非公平锁的tryacquire()方法内部调用nonfairtryacquire方法如下:
若tryacquire()方法再次尝试不成功。则首先会调用addwaiter()方法,将当前线程加入等待队列。addwaiter方法返回一个node节点。
返回节点后,acquirequeued(node,1)会再次尝试去做更新。
若还是无法更新,则通过parkandcheckinterrupt将线程挂起。
reentrantlock的unlock方法
查看release()方法。
若队列的head不为空,且head的等待状态不为0,则调用unparksuccessor()方法。
unparksuccessor()方法如下:
使node的next从后向前遍历,获取到队列中最前面的一个waitstatus小于0的线程。然后将节点上的线程继续执行。
上一篇: 直播时怎么喊麦?主播MC新手入门喊麦技巧
下一篇: js基础学习之语法要点
推荐阅读
-
Java并发系列之Semaphore源码分析
-
Java并发系列之CyclicBarrier源码分析
-
Java并发之ReentrantLock类源码解析
-
Java并发系列之ConcurrentHashMap源码分析
-
Java并发系列之CountDownLatch源码分析
-
死磕 java同步系列之Phaser源码解析
-
Java中的容器(集合)之ArrayList源码解析
-
死磕 java同步系列之CyclicBarrier源码解析——有图有真相
-
Java中的容器(集合)之HashMap源码解析
-
并发编程(五)——AbstractQueuedSynchronizer 之 ReentrantLock源码分析