• Java并发——ReentrantLock类源码阅读


    ReentrantLock内部由Sync类实例实现。

    wps7497.tmp

    Sync类定义于ReentrantLock内部。

    wps74A8.tmp

    Sync继承于AbstractQueuedSynchronizer。

    AbstractQueuedSynchronizer继承于AbstractOwnableSynchronizer。

    AbstractOwnableSynchronizer类中只定义了一个exclusiveOwnerThread变量,表示当前拥有的线程。

    wps74A9.tmp

    除了Sync类,ReentrantLock内部还定义了两个实现类。

    wps74BA.tmp

    NonfairSync是非公平锁。FairSync 是公平锁。

    ReentrantLock两个构造方法如下:

    wps74BB.tmp

    ReentrantLock的lock方法

    wps74BC.tmp

    非公平锁的lock方法

    wps74CC.tmp

    compareAndSetState方法是一个CAS方法。该方法尝试去更新对象内的一个变量。变量期望是0,更新为1。

    若更新成功,则将exclusiveOwnerThread变量设置为当前线程。然后lock方法会立刻返回。

    若更新不成功,则调用acquire(1)。

    wps74CD.tmp

    acquire方法中首先调用tryAcquire()再次尝试更新。

    非公平锁的tryAcquire()方法如下:

    wps74CE.tmp

    非公平锁的tryAcquire()方法内部调用nonfairTryAcquire方法如下:

    wps74DF.tmp

    若tryAcquire()方法再次尝试不成功。则首先会调用addWaiter()方法,将当前线程加入等待队列。addWaiter方法返回一个Node节点。

    wps74E0.tmp

    返回节点后,acquireQueued(node,1)会再次尝试去做更新。

    wps74E1.tmp

    若还是无法更新,则通过parkAndCheckInterrupt将线程挂起。

    wps74F2.tmp

    ReentrantLock的unlock方法

    wps74F3.tmp

    查看release()方法。

    wps74F4.tmp

    若队列的head不为空,且head的等待状态不为0,则调用unparkSuccessor()方法。

    unparkSuccessor()方法如下:

    wps74F5.tmp

    使node的next从后向前遍历,获取到队列中最前面的一个waitStatus小于0的线程。然后将节点上的线程继续执行。

  • 相关阅读:
    html、css、js文件加载顺序及执行情况
    python之路_前端基础之jQuery入门3
    python之路_前端基础之jQuery入门2
    python之路_前端基础之jQuery入门1
    python之路_前端基础之JS5
    python之路_前端基础之JS4
    python之路_前端基础之CSS布局3
    python之路_前端基础之JS(3)
    python之路_前端基础之JS(2)
    python之路_前端基础之JS(1)
  • 原文地址:https://www.cnblogs.com/shijiaqi1066/p/5156406.html
Copyright © 2020-2023  润新知