美文网首页
CountDownLatch VS CyclicBarrier

CountDownLatch VS CyclicBarrier

作者: 万福来 | 来源:发表于2020-05-07 16:40 被阅读0次

    CountDownLatch VS CyclicBarrier

    实现方式不同

    • CountDownLatch基于AQS实现
    • CyclicBarrier基于ReentrantLock实现

    实现原理

    • CountDownLatch创建一个内部同步器实现AQS类,同步器中的初始state数量为counddown总数量;主线程调用await方法后,尝试通过调用内部同步器的getState方法是否为0,如果如果为0表示所有子线程已经执行完成,主线程可以继续执行,如果不为0则表示还有子线程没有执行完成,所以此时将主线程加入等待队列进行等待,子线程则通过同步队列中的共享释放模板方法对state进行减1处理,当state值为0的时候在唤醒等待队列中的主线程重新判断state的值是否为0,如果是0则直接进行后续操作,由于state值为0后,初始值则没有在修改,所以CountDownLatch实例对象只能使用一次。

    • CyclicBarrier是内部维护了一个count计数器,每当有线程调用CyclicBarrier对象await方法时,都会首先获取一个ReentrantLock,抢到锁之后对count计数器进行减1处理,然后判断count是否等于0,如果不为0;则表示还有线程没有到达,则直接调用锁条件的await方法并释放当前锁,进入等待锁条件触发状态;如果后来的线程对count计数器进行减1操作后;count值为0则表示所有线程都已经执行完成,则直接调用锁条件的singleAll方法,通知锁条件上的所有等待线程继续执行,最后重置CyclicBarrier的内部状态和计数器,进行下一轮操作。所以CyclicBarrier对象是可以多次复用的。

    相关文章

      网友评论

          本文标题:CountDownLatch VS CyclicBarrier

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