并发编程JUC-CountDownLatch源码解析

JUC框架 源码解析系列文章目录 JDK8 前言 笔者在接下来这段时间将对JUC框架内的重点内容进行深度解析,由于内容颇多,需要分成多篇文章,所以在这里列一个目录,方便大家翻阅。 目录 JUC框架的基础是CAS和自旋,而CAS则是利用Unsafe类提供的CAS操作,而原子类则依靠于CAS和自旋。下面几篇文章从源码分析JUC框架内的几个重要的原子类。 JUC AtomicInteger源码解析 JDK8 JUC AtomicIntegerArray源码解析 JDK8 JUC AtomicStampedReference源码解析 JDK8 AQS(A 阅读详情

为了做下测试,我使用了上面这个例子,虽然没有用到线程但是原理还是一样,CountDownLatch的原理和适用场景大家应该都知道,就是主线程等其它线程都完成之后再继续执行。废话不多说,看源码。先从构造函数开始

CountDownLatch countDownLatch = new CountDownLatch(2);

如果传进的数值小于0,抛出异常。这里有个Sync对象,点进去看下是什么??

它是CountDownLatch的一个静态内部类,但是继承了AQS,它的构造函数是个setState(int count)方法。点进去

这个方法是在AQS内部实现的,也就是将我们传进来的值赋给一个state的变量。构造函数解析完了,现在来看下下面这个方法

countDownLatch.countDown();
这个方法原理就是将计数器减 1,我们看下源码是怎么实现的。

又调用了一层方法,继续跟进去

提一嘴,这个arg = 1,在上面方法有的。这里先看下这个if的判断条件,点进去

它是在CountDownLatch类实现的,这里是个死循环,首先获取state的值,记得在初始化CountDownLatch的时候我们传进去的值是赋给了这个变量state,然后进行判断,如果 state(也就是图中的int c) = 0,直接返回false,如果不为0,那么使用CAS来进行减1操作,最后判断 这个state在减1之后是否还是等于0。这里会有三种情况

第一种:如果此时state =0 ,但是此时还有其他线程执行到这里了,所以直接返回 false

第二种:此时state不等于0,但是有一个线程执行到这了,在减1之后等于0,那么返回true

第三种:此时state不等于0,但是有一个线程执行到这了,在减1之后不等于0,那么返回false。

现在回到下面这个方法

如果是返回false的是什么都不做,如果返回true,也就是上面第二种情况,就是state已经等于0了。进入到doReleaseShared()方法中。

在debug模式下发现进入到这个方法之后,head = null,所以会直接执行 break;也就是什么都不做。然后返回。接下来就是执行

countDownLatch.await();

还是进入这个方法的源码

继续跟进去

首先判断主线程是否是被中断的,如果是抛出异常。 如果没有进入if的判断,看下这个if判断了什么

如果state==0,那么返回1,也就意味着所有线程都执行完了,如果大于0,那么返回 -1,也就意味着还有线程没有执行完,

为什么会有这样的一个判断呢??? 因为线程的执行是具有随机性的,有可能你的其它线程还没有执行完,也就是state还不等于0,但是主线程已经执行到await()这个方法了。这个相信大家是能理解的,所以,如果此时state=0,以为着其它线程都执行完了,那么主线程自然可以继续往下执行。但是如果此时state > 0,意味着还有线程没有处理完任务,那么就会执行doAcquireSharedInterruptibly()这个方法了

首先看下

final Node node = addWaiter(Node.SHARED);

这里的Thread.currentThread()在这里就是main线程,如果不信大家把我们测试用例换成下面这样

你再进debug模式就可以知道了。这个方法的目的就是将主线程放到一个队列中去。然后返回当前这Node。

之前我们分析过,如下图

只有当state不等于0,并且主线程执行到了才会执行到下面这个方法

所以第一次肯定是会执行第二个 if 的语句块的。我们重点看下第二个判断

LockSupport.park()就是阻塞当前线程的。所以主线程是不能继续执行下去的。那又是什么时候唤醒的呢?? 看下上面的 setHeadAndPropagate()方法

最后还是用LockSupport.unpach()方法唤醒的,所以主线程就可以继续往下执行

JUC源码解析 JUC包源码解析 阅读详情

相关推荐

ldpc编解码器设计与仿真

计算校验节点到变量节点的消息 m_{c \to v}=2 \cdot atanh(\prod_{v’ \in N©\setminus v}tanh(\frac{m_{v’ \to c}}{2}))。计算变量节点到校验节点的消息 m_{v \to c}=L_{v,0}+\sum_{c’ \in M(v)\setminus c}m_{c’ \to v}。◦ 对于每个变量节点 v,计算最终 LLR 值 L_{v,f}=L_{v,0}+\sum_{c \in M(v)}m_{c \to v}。

youngerwang的博客 811

【JUC并发编程】15 CountDownLatch原理、源码解析

CountDownLatch实现原理、源码分析

健身变秃,coding变强 700

7.7 数据分析助手:用AI洞察业务数据价值

摘要:AI数据分析助手构建指南 本文介绍了如何构建AI数据分析助手,帮助企业从业务数据中提取价值。系统包含四大核心模块:自然语言理解模块解析用户查询意图,查询规划模块转换为SQL语句,数据可视化模块生成图表,以及洞察生成模块提供深度分析。文章通过销售数据分析助手案例,展示了从数据库准备到自然语言处理的完整实现流程,包括示例代码和系统架构图。该解决方案可降低数据分析门槛,让业务人员直接参与数据探索,提升决策效率。

yonggeit的博客 4093

Java面试题2025-并发编程高级(JUC并发工具及异步编程)

CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。需要一个并发安全的计数器来操作。CountDownLatch就可以实现。给CountDownLatch设置一个数值。可以设置3。每个业务处理完毕之后,执行一次countDown方法,指定的3每次在执行countDown方法时,对3进行-1。主线程可以在业务处理时,执行await,主线程会阻塞等待任务处理完毕。

卿着飞翔 1427

【crawler笔记】R语言简单动态网页爬虫(rvest包)示例

1、爬虫目标 大家普遍认为Python的爬虫功能强大,但在解决动态加载或者登陆网站时,Python存在一定困难的,相对于一些普通爬虫,使用R语言会更方便。 以https://www.thepaper.cn/为例,爬取首页的新闻(标题、内容、时间),主要采用的是动态网页中常用的httr包。 初始学习时,参考了B站《20分钟入门基于R语言的网络爬虫_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili》的视频,但代码运行出现了报错,所以在原代码上做了修改。 2、代码分析及报错修改 library(rv

seeyouer1205的博客 3275

WPF MVVM实战:构建可绑定的RichTextBox富文本编辑器

本文详细介绍了如何在WPF MVVM模式下构建可绑定的RichTextBox富文本编辑器,解决标准RichTextBox.Document属性不支持数据绑定的问题。通过创建自定义BindableRichTextBox控件,实现FlowDocument的绑定支持,并分享插入图片、文本格式控制等实战技巧,帮助开发者高效开发富文本编辑功能。

weixin_33717117的博客 307

synchronized细节及JUC中AQS,ReentrantLock,ReentrantReadWriteLock,Semaphore,CountdownLatch源码解析

AOS(AbstractOwnableSynchronizer)抽象父类 ,定义了同步器,将锁与线程id进行绑定的成员便利与get与set的方法,需要注意的是,对于保存了owner thread引用的成员变量,加了transient关键字,确保对象经过序列化与反序列化其对象引用都不会发生变化/**} /**/**} /**/**} /**

u010164911的博客 246

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2833

AQS之hasQueuedPredecessors方法源码分析

AQS之hasQueuedPredecessors方法源码分析 为什么先读取tail,再读取head hasQueuedPredecessors方法false的情况 hasQueuedPredecessors方法true的情况

zqj1172102457的博客 839

大模型推理常见采样策略:Top-k, Top-p, Temperature, Beam Search

大模型推理采样策略,举例通俗易懂汇总介绍

qq_43243579的博客 2万+

Hermes深入理解及源码解析(二):Hermes的记忆机制

源码位置:tools/memory_tool.py存储内容为两个文件,放在 ~/.hermes/memories/:MEMORY.md:Agent 自己的笔记(环境事实、项目约定、工具坑、学到的东西)—— 上限 2200 字符USER.md:关于用户的画像(角色、偏好、沟通风格)—— 上限 1375 字符作为一个独立的工具注册在系统中(为了让智能体正确使用它,System Prompt()中明确下达了禁令存储目标存储位置数据类型持久偏好/事实MEMORY.md我是谁、我喜欢什么、环境配置。

qq_41984117的博客 562

Java高并发处理总结

自己参考大牛博客及视频写了一些关于并发的感悟,高并发的处理思路,无外乎以下几种 1 代码层面: 锁优化措施(见本文内容)、尽量简化事务和减少事务 2 应用层面:缓存 队列 限流 熔断  3数据库层面: 分库分表 读写分离 JDK常见并发包处理工具中,ReentrantLock、countdownlanth、currenthasp、AQS源码一定要多读多看,理解里面的设计精髓。带着问题去思考...

很多时候犯错都是在不知情的情况下发生的 1万+

R语言深度学习实战:基于YOLO的目标检测

目标检测是计算机视觉领域的一项任务,旨在识别图像或视频中的物体,并确定它们的位置。与图像分类不同,目标检测要求模型能够识别多个物体,并为每个物体提供边界框(bounding box)的位置信息。这种任务在众多应用中都具有重要价值,例如自动驾驶、安防监控、物体跟踪等。YOLO(You Only Look Once)是一种非常流行的目标检测算法,它在速度和准确性之间取得了良好的平衡。与传统的目标检测方法不同,YOLO将目标检测任务视为回归问题,直接从输入图像中预测目标的类别和位置信息。

YOLO 330

并发编程笔记八-JUC并发工具应用与源码深度解析

本章讲解了CountDownLatch,CyclicBarrier以及Semaphore三个并发工具类的介绍,应用以及源码的深度解析。相信如果有如ReentrantLock,AQS源码阅读的基础,再读这三个并发工具类的源码其实是没有太多难度的,关键是要耐心去看,去分析,自己画图,自己尝试去写代码注释。

qq_41191331的博客 804

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 中的锁的问题

1. synchonrize如何更好地使用? 谈到这个问题, 主要先从这几个方面来入手: 线程的几种状态synchonrize的几种使用方法比较synchonrize和volatile比较synchonrize和juc中的锁比较用了锁就真的没有并发问题了么? 1.1 线程的几种状态 不熟悉线程的生命周期和相互的转换控制, 是无法写好并发代码的.  图简单易懂,

静水流深 4192

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Jdk1.6 JUC源码解析汇总

Jdk1.6 JUC源码解析汇总   Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX   Jdk1.6 JUC源码解析(2)-atomic-AtomicXXXArray   Jdk1.6 JUC源码解析(3)-atomic-AtomicXXXFieldUpdater   Jdk1.6 JUC源码解析(4)-atomic-AtomicStampedRefer...

永远保持敬畏之心 356

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java并发编程之CountDownLatch源码解析

一、导语 最近在学习并发编程原理,所以准备整理一下自己学到的知识,先写一篇CountDownLatch的源码分析,之后希望可以慢慢写完整个并发编程。 二、什么是CountDownLatch CountDownLatch是java的JUC并发包里的一个工具类,可以理解为一个倒计时器,主要是用来控制多个线程之间的通信。 比如有一个主线程A,它要等待其他4个子线程执行完毕之后才能执行,此时就可以利用Co...

weixin_33758863的博客 151

Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁"。在“Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock ”中,对Java的独占锁进行了说明。本章对Java的“共享锁”进行介绍,JUC中的共享锁有CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWrit

XINJing的专栏 3872

Java-AQS深入理解

AQS核心原理与实现机制 AQS(AbstractQueuedSynchronizer)是Java并发包中构建锁和同步器的核心框架。它通过state变量表示同步状态,采用CLH队列管理等待线程,并提供独占和共享两种获取模式。AQS内部维护一个双向链表结构的同步队列和单向链表的条件队列,使用CAS操作保证线程安全。基于模板方法模式,开发者只需实现tryAcquire等特定方法即可构建自定义同步器。ReentrantLock、Semaphore等常用并发工具均基于AQS实现

Khazix的博客 760

JUC并发编程

JUC并发编程 JUC简介 进程、线程的关系 Java默认有两个线程 线程的六种状态 并发、并行的关系: Lock锁 Synchronized 和 Lock的区别 8锁现象 问题一 : 在标准情况下,两个线程先打印 发短信 还是 打电话 ? 问题二 : 在发短信方法中,延迟4秒,两个线程先打印 发短信 还是 打电话? 问题三 : Phone类增加一个普通方法,线程B调用,那么两个线程先打印 发短信

识时务者的个人博客 14万+

Java多线程 - CyclicBarrier原理

1.概述 现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。 在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作...

qiang_zi_的专栏 295

【JUC】CountDownLatch源码分析

1.什么是CountDownLatch 之前写了一篇关于JUC包里关于并发编程工具类的笔记,但过后总感觉不太舒服,不通透,所以,这次就想着先把整个CountDownLatch源码撸一遍。 至于CountDownLatch是什么,撸代码前,可先看:【JUC】CountDownLatch/CyclicBarrier/Semaphore 2.开撸 2.1 类图 先从类图开始,一步一步看。 idea找到...

aaa_bbb_ccc_123_456的博客 2503

JUC 工具类大全:CountDownLatch、Semaphore、CyclicBarrier 有何区别?

摘要:本文深入解析Java并发编程中CountDownLatch、Semaphore和CyclicBarrier三大同步工具。CountDownLatch用于主线程等待子任务完成,基于AQS实现一次性计数;Semaphore通过许可机制控制并发线程数,支持公平/非公平策略;CyclicBarrier实现多线程阶段性同步,支持循环使用和回调机制。文章从源码层面对比三者的实现原理,分析适用场景,并给出使用建议:CountDownLatch适合任务完成通知,Semaphore用于限流,CyclicBarrier适

小健学Java的博客 1747

Juc并发编程14——线程计数器CountdownLatch源码剖析

CountdownLatch,多任务同步神器,它允许一个或多个线程,等待其它线程完成工作,本文讲解其使用与源码

半旧518的博客 833

JUC工具类-CountDownLatch

是一个用于线程同步的工具类,允许一个或多个线程等待其他线程完成操作。它包含一个计数器,初始值通过构造函数设定。当其他线程调用方法后,计数器减一;当计数器值为 0 时,所有调用await()被阻塞的线程被唤醒。CountDownLatch 虽然看似简单,但其背后的原理体现了 Java 并发编程的设计精髓。通过本篇内容,相信你不仅掌握了它的使用方式,更理解了它为何如此设计、如何保证线程安全、以及如何灵活应用。

左灯右行的爱情 942

JUC-CountDownLatch源码分析

建议阅读CountDownLatch源码分析之前,,了解一下CountDownLatch用处以及基本用法。我们知道CountDownLatch是一个同步工具类,表示允许一个或者多个线程来等待其他的线程来完成它们的操作后,才继续执行自己的操作。.........

zqj1172102457的博客 387
上一篇: Redis指南【3】 特殊结构和高级用法
下一篇: 并发编程JUC--Semaphore源码解析
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值