美文网首页
[并发编程]快速解读Condition的实现

[并发编程]快速解读Condition的实现

作者: 6cc89d7ec09f | 来源:发表于2018-11-24 13:09 被阅读29次

    摘自《java并发编程的艺术》

    Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到
    Condition对象关联的锁。Condition对象是由Lock对象(调用Lock对象的newCondition()方法)创
    建出来的,换句话说,Condition是依赖Lock对象的
    Condtion的实现类CondtionObject是同步器AbstractQueuedSynchronizer的内部类。
    一个Condition包含一个等待队列(FIFO),Condition拥有首节点(firstWaiter)和尾节点
    (lastWaiter)


    image.png

    当前线程调用Condition.await()方法,将会以当前线程构造节点,并将节点从尾部
    加入等待队列,
    节点的更新不需要CAS保证,因为执行await()的线程必定是已经获取锁的。
    Object的监视器模型上,一个对象拥有一个同步队列和等待队列。然而AQS上拥有一个同步队列和多个等待队列。


    image.png

    调用Condition的await()方法

    当调用此方法,相当于同步队列的首节点(获取了锁的节点)移动到Condition的等待队列中。该方法当前线程构造成节点并加入等待队列中,然后释放同步状态,唤醒同步队列中的后继节点,然后当前线程会进入等待状态。


    image.png

    调用Condition的signal方法

    调用该方法的前置条件是当前线程必须获取了锁,接着获取等待队列的首节点,将其移动到同步队列,当节点移动到同步队列后,当前线程再使用LockSupport唤醒该节点的线程。被唤醒后的线程,先会判断自己是否已经在同步队列中,进而调用同步器的acquireQueued()方法加入到获取同步状态的竞争中


    image.png

    相关文章

      网友评论

          本文标题:[并发编程]快速解读Condition的实现

          本文链接:https://www.haomeiwen.com/subject/jcweqqtx.html