CountDownLatch、Semaphore(信号量)和ReentrantReadWriteLock.ReadLock(读锁)都采用AbstractOwnableSynchronizer共享排队的方式实现。

关于AbstractQueuedSynchronizer中的独占锁和共享锁,请参考ReentrantLock(http://www.cnblogs.com/bjorney/p/8040085.html)和ReentrantReadWriteLock(http://www.cnblogs.com/bjorney/p/8064268.html)

1. CountDownLatch

public class CountDownLatch {
private final Sync sync; public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count); // sync的锁状态(锁计数)state = count
} public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1); // 参数1并未使用
} public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
} public void countDown() {
sync.releaseShared(1); // sync的锁状态(锁计数)state--,见Sync.tryReleaseShared
} ... ... }

2. CountDownLatch.sync

private static final class Sync extends AbstractQueuedSynchronizer {
Sync(int count) {
setState(count); // sync的锁状态(锁计数)state = count
} protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1; // 若state > 0(尝试取锁失败),则当前线程进入SyncQueue排队等锁
} protected boolean tryReleaseShared(int releases) {
for (;;) {
// CAS(state)失败将回到此处
int c = getState(); /*记录state*/
if (c == 0)
return false;
int nextc = c - 1;
if (compareAndSetState(c, nextc)) /*CAS设置state -= 1*/
return nextc == 0; // 若state为0(尝试释放锁成功),则唤醒所有在SyncQueue排队等锁的节点(线程)
}
}
}

最新文章

  1. ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作
  2. Windows 10设置桌面图标间距、窗口的背景颜色、选中文字的背景颜色
  3. Understanding Linux /proc/cpuinfo
  4. UNDO表空间设置
  5. for-in语句
  6. JAX-WS 学习二:基于WEB容器,发布WebService
  7. flexigrid 修改json格式
  8. zend studio 使用断点调试
  9. C# 从零开始 vol.2
  10. NC帮助文档网址
  11. 利用face_recognition库裁取人脸
  12. html笔记第一天
  13. dpkg: 处理软件包 xxx (--configure)时出错 解决办法
  14. HTML怎么实现字体加粗
  15. VS2017编译SNMP++步骤记录
  16. [SDOI2017]树点涂色
  17. 行为链分析zipkin
  18. 利用Linux的硬连接删除MySQL大文件
  19. 递归n!
  20. Webpack 常见静态资源处理 - 模块加载器(Loaders)+ExtractTextPlugin插件

热门文章

  1. javascript 中的 this 关键字详解
  2. 69.Spartan-6的SelectIO资源
  3. Linux内核中的队列 kfifo【转】
  4. 64_p4
  5. Linux 上配置 NTP SERVER
  6. Tutorial 7: Schemas &amp; client libraries
  7. 通过复制(拷贝)新建javaweb项目报错无法访问
  8. PHP学习笔记之数组游标操作
  9. hosts,命令行前面的显示
  10. 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告