当前位置: 首页 > 后端技术 > Java

Java并发——CountDownLatch与CycliBarrier异同详解

时间:2023-04-01 13:36:57 Java

大家好,我是奇喵小屋,一个分享技术和生活的博主。以下是我的主页。每个主页都更新了高质量的博客。创建起来并不容易。请关注掘金主页。将来会发布更多的MySQL。Redis、并发、JVM、分布式等面试热点知识,以及Java学习路线、面试重点、职业规划、面经等相关博文转载请注明出处!1.CountDownLatch允许一个或多个线程等待其他线程完成操作1.1类图1.2方法介绍publicCountDownLatch(intcount)用于初始化stateawait()如果状态不为0,则线程进入WATING状态(通过LockSupport)untilthestatechanges0(interruptible)如果状态为0,则线程不会WATINGcountDown()将state-1,如果状态减为0-唤醒所有WATING线程那套Sync实现tryAcquireShared(intacquires)——如果状态为0,则获取共享锁。如果state不为0,则共享锁获取失败,然后会通过LockSupport进入WATING状态。countDown()底层调用是AQS在释放共享锁的Sync集合中实现tryReleaseShared(intreleases)——如果state为0则返回false,锁不会释放。如果state不为0,则在state-1之后将state-1设置为0。然后返回true,成功释放锁,唤醒所有WATING线程。如果state-1不为0,则返回false,锁不会被释放。2.CyclicBarrier当一组线程到达CyclicBarrier时,它们会被阻塞,直到最后一个线程到达barrier,所有被阻塞的线程才能继续运行(count的初始值为parties,每当一个线程调用CyclicBarrier的await()时,它会让count-1,如果count-1不为0,则线程进入WATING,如果count-1为0后,会打破屏障,唤醒所有WATING线程)2.1类图2.2构造方法publicCyclicBarrier(intparties){这(各方,空);}//初始化parties,count,barrierCommandpublicCyclicBarrier(intparties,RunnablebarrierAction){if(parties<=0)thrownewIllegalArgumentException();this.parties=派对;this.count=派对;this.barrierCommand=barrierAction;}2.3await()可以中断2.4reset()上锁调用nextGeneration()调用breakBarrier()释放锁可以用reset()重置