这次分析CountDownLatch,相信大部分人都用过把!

CountDownLatch内部还是Sync对象,还是基础AQS(可见其重要性),首先看一下CountDownLatch初始化,CountDownLatch初始化一个state状态值,

这个值就是AQS中获取锁得state值,CountDownLatch首先是基于共享锁实现得,实现了AQS中得 tryAcquireShare()方法跟tryReleaseShared()方法。

首先看一下countDown()方法,调用AQS得releaseShared(1)方法,首先尝试获获取锁,如果state等于0,返回false。不需要唤醒等待队列,

如果更新state-1成功判断是否==0,如果等于0开始唤醒等待队列。这个方法比较简单。

调用唤醒方法,先获取head节点,然后判断是否只有一个节点,或者head节点是否为空,如果都不是,然后获取等待状态,

判断是否是signal如果是先更新为0,然后唤醒next节点,如果此时只有一个head节点时候waitStatus=0,然后设置为PROPAGATE,等待下一个阻塞节点加入

然后修改为signal状态。如果head节点被唤醒的节点修改的时候,此循环会继续唤醒 header的next节点。这块的设计目前看还是有点模糊,这块有很多状态,

就是唤醒的线程获取到锁更新header节点的时候,还需要好好琢磨。

在看一下await()方法.调用AQS中得tryAcquireShareNanos()或者acquireShareinterruptibly()方法,首先会tryAcqureShared()获取锁,

如果此时锁state==0返回-1此时进去doAcquireShareinterruptibly()阻塞,

添加一个share的Node节点到节点尾,然后获取其前驱节点,如果前驱节点是head节点,然后再次获取锁,如果获取到则设置header节点为

当前node节点,如果不是head节点,则挂起当前节点。

setHeadAndpropagate()方法设置node节点为header头,并唤醒next节点,使节点唤醒传播下去。

最新文章

  1. poj2833
  2. rsync排除文件同步
  3. [linux] shellshock
  4. ViewPager中GridView问题
  5. IOS iphone 4inch上应用没有全屏,上下有黑边(转)
  6. Intellij调试debug
  7. ReportViewer导出功能筛选
  8. Jquery简略API使用
  9. 批量数据上传的sql.xml
  10. 《UNIX网络编程》TCP客户端服务器例子
  11. Css静态进度条
  12. 『vue踩坑日常』 在index.html中引入静态文件不生效
  13. DISK 100% BUSY,谁造成的?(ok)
  14. ssm框架的整合搭建(一)
  15. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
  16. Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境
  17. 垃圾收集器之:throughput吞吐量收集器
  18. MongoDB服务无法启动,发生服务特定错误:100
  19. Rico Board.1.环境配置
  20. GUC-12 ScheduledThreadPool

热门文章

  1. for(auto count:counts)
  2. Zabbix Agent 安装指南和 Zabbix Server 设置自动发现
  3. 由函数$y=\sin x$的图像伸缩变换为函数$y=\sin(\omega x)$的图像(交互式)
  4. [Algorithm] Area of polygon
  5. [Algorithm] Convert a number from decimal to binary
  6. phpstorm快捷键和激活
  7. jQuery.getScript(url, [callback])
  8. Flash上传超大文件解决方案
  9. word粘贴图片到ckeitor
  10. jq获取页面中checkbox已经选中的checkbox