这次分析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节点,使节点唤醒传播下去。

java源码-CountDownLatch源码分析的更多相关文章

  1. Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理

    前言: 如果说J.U.C包下的核心是什么?那我想答案只有一个就是AQS.那么AQS是什么呢?接下来让我们一起揭开AQS的神秘面纱 AQS是什么? AQS是AbstractQueuedSynchroni ...

  2. CountDownLatch源码浅析

    Cmd Markdown链接 CountDownLatch源码浅析 参考好文: JDK1.8源码分析之CountDownLatch(五) Java并发之CountDownLatch源码分析 Count ...

  3. Java - "JUC" CountDownLatch源码分析

    Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例 CountDownLatch简介 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前 ...

  4. java线程池ThreadPoolExector源码分析

    java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...

  5. 死磕 java集合之DelayQueue源码分析

    问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于 ...

  6. 死磕 java集合之PriorityBlockingQueue源码分析

    问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的 ...

  7. 死磕 java集合之PriorityQueue源码分析

    问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合 ...

  8. 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计

    问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...

  9. 死磕 java集合之LinkedHashSet源码分析

    问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? (4)LinkedHashS ...

随机推荐

  1. springboot集成Spring Session

    10.1 分布式集群环境下的集成(同域名.同项目) 10.1.1        创建SpringBoot的web支持项目07-springboot-session 创建项目 10.1.2        ...

  2. sum(n,m)的解法

    给出两个整数n和m,你应该计算从n到m的所有整数的和.换句话说,你应该计算: SUM(n,m)= n +(n + 1)+(n + 2)+ ... +(m-1)+ m 方法1. 方法2.

  3. 在RecyclerView中集成QQ汽泡二

    上次已经将GooView集成到RecyclerView当中了[http://www.cnblogs.com/webor2006/p/7787511.html],但是目前还有很多问题,下面先来运行看一下 ...

  4. Linux之vi文本编辑器

    vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).输入模式(Insert mode)和末行模式(last line mode),各模式的功能区分如下: 1) 命令 ...

  5. 让Eclipse启动时显示选择workspace的对话框

    选择菜单栏的window-->Preferences-->General-->Startup and Shutdown 把右面的第一个复选框“Prompt for workspace ...

  6. pandas聚合和分组运算之groupby

    pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个键(可以是函数.数组或DataFrame列名)拆分pandas对象.计算分 ...

  7. SpringMVC全局异常统一处理

    SpringMVC全局异常统一处理以及处理顺序最近在使用SpringMVC做全局异常统一处理的时候遇到的问题,就是想把ajax请求和普通的网页请求分开返回json错误信息或者跳转到错误页. 在实际做的 ...

  8. vs2017 gitee项目无法提交同步的解决办法

    下载扩展跟更新:  gitee插件 然后命令行输入: git push --set-upstream origin master 参考 https://www.cnblogs.com/slwangzi ...

  9. C# 常用方法——base64字符串转图片

    其他常用方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html /// <summary> /// base64编码的文本转为图片 / ...

  10. 使用kombu的producer pool 向rabbitmq瞬间发送大量消息

    kombu比pika感觉考虑得全面多了,不知道为什么用的人好像少? 生产端是 python-socket.io 的client   接受socketio 消息后, 发到rabbitmq 按时序进行处理 ...