Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Semaphore、CountDownLatch 的实现原理浅析,希望能够帮助你!!!。
面试阿里P7Java岗被问原理源码,还好我有这一份框架源码PDF
真阿里P8架构师推荐,Linux学习文档!「鸟哥的私房菜PDF」
Semaphore(信号量)它通过 new Semaphore(permits) 来进行创建,permits 表示同一时间可以执行多少个线程。
使用 acquire 来获得许可,通过 release 来释放许可。在同一时间只允许 permits 个线程同时运行。
可以看到输出结果,当线程数量达到上限的时候,其它线程无法执行,释放了一个线程后归还一个信号量,那么下一个线程才能执行。
它的实现原理如下
CountDownLatch 内部维护了一个计数器,当计数器不为 0 的时候调用其 await() 可以进行阻塞,每次使用 countDown() 计数器值 - 1,当计数器值为 0 的时候,所有阻塞的线程从 await() 返回
利用这个特性我们可以用来合并多个线程最终的结果,或者以此来模拟并发请求调用等等,如下并发请求代码
此处的“锁”的成功与否表现其实就是 CountDownLatch 的一个同步值的变化
我们来分析下 CountDownLatch 是如何做到的以下两张图分别展示了在 countDown() 和 await() 的原理,源码跟着看就行了就不贴出来了
此时唤醒同步队列中的等待结点后,await() 中挂起的线程将被唤醒,然后再次将下一个结点设置为头结点,唤醒下一个结点如此往复,最终所有的线程将被唤醒
作者:在江湖中coding
链接:https://juejin.im/post/5e0420a7f265da33b0718c67
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章