CountDownLatch,CyclicBarrier,Semaphore
概要
前面对"独占锁"和"共享锁"有了个大致的了解;本章,我们对CountDownLatch进行学习。和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁"。本章的内容包括:
CountDownLatch简介CountDownLatch数据结构
CountDownLatch源码分析(基于JDK1.7.0_40)
CountDownLatch示例
CountDownLatch简介
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch和CyclicBarrier的区别
(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
(02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
关于CyclicBarrier的原理,后面一章再来学习。
CountDownLatch函数列表
CountDownLatch数据结构
CountDownLatch的UML类图如下:
CountDownLatch的数据结构很简单,它是通过"共享锁"实现的。它包含了sync对象,sync是Sync类型。Sync是实例类,它继承于AQS。
总结:CountDownLatch是通过“共享锁”实现的。在创建CountDownLatch中时,会传递一个int类型参数count,该参数是“锁计数器”的初始状态,表示该“共享锁”最多能被count给线程同时获取。当某线程调用该CountDownLatch对象的await()方法时,该线程会等待“共享锁”可用时,才能获取“共享锁”进而继续运行。而“共享锁”可用的条件,就是“锁计数器”的值为0!而“锁计数器”的初始值为count,每当一个线程调用该CountDownLatch对象的countDown()方法时,才将“锁计数器”-1;通过这种方式,必须有count个线程调用countDown()之后,“锁计数器”才为0,而前面提到的等待线程才能继续运行!
CyclicBarrier原理和示例
本章介绍JUC包中的CyclicBarrier锁。内容包括:
CyclicBarrier简介CyclicBarrier数据结构
CyclicBarrier源码分析(基于JDK1.7.0_40)
CyclicBarrier示例
CyclicBarrier简介
CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
注意比较CountDownLatch和CyclicBarrier:
(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
(02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
CyclicBarrier函数列表
CyclicBarrier数据结构
CyclicBarrier的UML类图如下:
CyclicBarrier是包含了"ReentrantLock对象lock"和"Condition对象trip",它是通过独占锁实现的。下面通过源码去分析到底是如何实现的。
Semaphore简介
Semaphore是一个计数信号量,它的本质是一个"共享锁"。
信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
Semaphore的函数列表
Semaphore数据结构
Semaphore的UML类图如下:
从图中可以看出:(01) 和"ReentrantLock"一样,Semaphore也包含了sync对象,sync是Sync类型;而且,Sync是一个继承于AQS的抽象类。(02) Sync包括两个子类:"公平信号量"FairSync 和 "非公平信号量"NonfairSync。sync是"FairSync的实例",或者"NonfairSync的实例";默认情况下,sync是NonfairSync(即,默认是非公平信号量)。
最新文章
- ERR_CONTENT_DECODING_FAILED错误的原因和解决办法
- Nancy之给我们的网站添加自定义图标
- PYTHON 全局变量和局部变量
- bzoj 4066: 简单题
- Scala
- X5学习笔记—给单元格添加颜色
- Codeforces Round #353 (Div. 2) D. Tree Construction (二分,stl_set)
- 【LeetCode】Flatten Binary Tree to Linked List
- WPF自定义ListBox样式
- 七天学会ASP.NET MVC (四)——Layout页面使用和用户角色管理 (代码下载)
- iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能
- 扫码JSP
- JS 上传文件 Uploadify 网址及 v3.2.1 参数说明
- 面试(三)---volatile
- cglib根据数据动态生成对象
- 你可能不知道的IDEA高级调试技巧
- 解决mybatis generator无法覆盖XML
- Linux基础命令---添加用户useradd
- Markdown基础教程
- linux用户和权限详解
热门文章
- HBase修改压缩格式及Snappy压缩实测分享
- Spring 开启Annotation <;context:annotation-config>; 和 <;context:component-scan>;诠释及区别
- PLSQL登录弹出空白框如何解决
- js 当前日期增加自然月
- postgresql 获取刚刚插入的数据主键id
- 哈夫曼算法(haffman)实现压缩和解压缩-C语言实现
- 基于安卓高仿how-old.net实现人脸识别估算年龄与性别
- Second Level Cache for Entity Framework 6.1
- php日期处理 -- 获取本周和上周的开始日期和结束日期(备忘)
- 这些年你需要注意的SQL