countdownlatch用法(CountDownLatch的使用)
1.概述
CountDownLatch就是一个或者一组线程在开始执行操作之前 ,必须要等到其他线程执行完才可以 。我们举一个例子来说明 ,在考试的时候,老师必须要等到所有人交了试卷才可以走 。此时老师就相当于等待线程 ,而学生就好比是执行的线程 。
注意:java中还有一个同步工具类叫做CyclicBarrier ,他的作用和CountDownLatch类似 。同样是等待其他线程都完成了 ,才可以进行下一步操作 ,我们再举一个例子 ,在打王者的时候 ,在开局前所有人都必须要加载到100%才可以进入 。否则所有玩家都相互等待 。
我们看一下区别:
CountDownLatch: 一个线程(或者多个) , 等待另外N个线程完成某个事情之后才能执行 。 CyclicBarrier : N个线程相互等待 ,任何一个线程完成之前 ,所有的线程都必须等待 。关键点其实就在于那N个线程(1)CountDownLatch里面N个线程就是学生,学生做完了试卷就可以走了 ,不用等待其他的学生是否完成(2)CyclicBarrier 里面N个线程就是所有的游戏玩家 ,一个游戏玩家加载到100%还不可以,必须要等到其他的游戏玩家都加载到100%才可以开局
2.简单使用
运行结果
3.原理
CountDownLatch主要使用countDown方法进行减1操作 ,使用await方法进行等待操作
countDown
OK 。到了这一步我们可能会纳闷 ,sync是个什么鬼,releaseShared方法又是如何实现的。我们不妨接着看源码
在这里我们发现继承了AbstractQueuedSynchronizer(AQS) 。AQS的其中一个作用就是维护线程状态和获取释放锁 。在这里也就是说CountDownLatch使用AQS机制维护锁状态。而releaseShared(1)方法就是释放了一个共享锁 。
await原理
不带参数的await会一直等待 ,直到CountDownLatch的count为0 ,带参数的await最多等待指定时间退出 ,如果时间没到 ,CountDownLatch的count为0就立刻退出 。如果CountDownLatch的count为0返回true ,否则返回false。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!