展开

关键词

CountDownLatch原理

上次大概说了CountDownLatch的使用,今天说下实现的原理CountDownLatch的使用效果和Join差不多,实现起来也比较简单。 源码分析 ---- 我们下面分析下CountDownLatch的源码: 创建CountDownLatch对象 ---- public CountDownLatch(int count) { < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } 创建CountDownLatch

20230

快速掌握并发编程---CountDownLatch原理和实战

方法一 在前面的文章中我们介绍了Thread类的join方法:快速掌握并发编程---Thread常用方法,join的工作原理是,不停检查thread是否存活,如果存活则让当前线程永远wait,直到thread 但问题来了,如果面试官问你实现原理,你却回答不上来,就会给人你在瞎用的感觉,这样好不容易前面拿到点好印象结果被打回原型。 至于join的原理,建议去看看我之前发的线程常用方法里:快速掌握并发编程---Thread常用方法,那里面说的很清楚了,所这里就不在重复了。 今天我们着重了了CountDownLatchCountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 常用方法 构造方法 我们在上面的案例中 int threadCount = 5; CountDownLatch countDownLatch = new CountDownLatch(threadCount

18140
  • 广告
    关闭

    腾讯云+社区系列公开课上线啦!

    Vite学习指南,基于腾讯云Webify部署项目。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

    首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设计原理。 下面我们将分析其设计原理。 设计原理 CyclicBarrier调用await()方法是线程等待,await()方法源码如下: ? CountDownLatch CountDownLatch的主要功能是实现几个计数器,使N个现场执行完成后当前线程才会继续执行下去。 输出: Thread-0执行完毕 Thread-1执行完毕 Thread-2执行完毕 Thread-3执行完毕 Thread-4执行完毕 主线程执行 原理分析 构造方法 ? CountDownLatch主要用于某个线程等待N个线程执行完后等待的线程接着继续执行下去,不能够重复执行,CountDownLatch通过设施AQS state值来实现,每次调用counDown方法后都去唤醒正在等待的线程

    26820

    CountDownLatch、CyclicBarrier和Semaphore区别及底层原理

    文章目录 一、CountDownLatch 1、CountDownLatch的用法 2、CountDownLatch的不足 3、底层原理 4、实例 二、CyclicBarrier 1、底层原理 2、实例 三、Semaphore 1、底层原理 2、实例 四、拓展 1、CycliBarriar和CountdownLatch的区别? 3、底层原理 借助了AQS队列同步器来完成功能。 1、底层原理 CyclicBarrier 基于 Condition 来实现的。 1、底层原理 Semaphore 内部是通过 AQS 来实现的。

    6940

    CountDownLatch、CyclicBarrier和Semaphore 使用示例及原理

    也欢迎查看我的csdn的此篇文章链接:CountDownLatch、CyclicBarrier和Semaphore 使用示例及原理 CountDownLatch CountDownLatch用户监听某些初始化操作 CountDownLatch 使用示例 使用示例,线程t3 要等待t1和t2执行完毕才执行: /** * @Description: CountDownLatch 等待和唤醒 * @Author: countDownLatch = new CountDownLatch(2); Thread t1 = new Thread(new Runnable() { CountDownLatch 源码解读 其实CountDownLatch用的底层原理就是AQS, 可以参考:(AQS原理详解)。 System.out.println("queue length: " + semaphore.getQueueLength()); threadPools.shutdown(); } } 原理也是使用

    58230

    CountDownLatch

    CountDownLatch作用阻塞一个或多个线程等待其他线程完成操作。 定义初始化的时候,需要传入一个正数来初始化计数器**(0也可以,但这样定义没有实际意义)。 CountDownLatch通常用于多个线程之间的协调工作。 假设有如下情节: 同时获取5张表的数据并一同返回 为了让cpu更好的得到利用,程序执行效率更高,使用多线程来完成。 那么刚才也有说CountDownLatch是阻塞一个或多个线程等待其他线程完成操作,那么我们试一下。 需要减少的总次数 private static CountDownLatch countDownLatch = new CountDownLatch(5); public static 总体CountDownLatch的作用以及使用就没有了,很简单,大家可以多多尝试。在开发中用到非常多。

    24120

    Java Review - 并发编程_ CountDownLatch原理&源码剖析

    CountDownLatch出现之前一般都使用线程的join()方法来实现这一点,但是join方法不够灵活,不能够满足不同场景的需要,所以JDK开发组提供了CountDownLatch这个类,使用CountDownLatch 实例 private static volatile CountDownLatch countDownLatch = new CountDownLatch(2); public static 子线程执行完毕后调用countDownLatch.countDown()方法让countDownLatch内部的计数器减1 所有子线程执行完毕并调用countDown()方法后计数器会变为0,这时候主线程的 join方法了,就是说countDownLatch相比join方法让我们对线程同步有更灵活的控制 类图关系 从类图可以看出,CountDownLatch是使用AQS实现的。 void await() 当线程调用CountDownLatch对象的await方法后,当前线程会被阻塞,直到下面的情况之一发生才会返回 当所有线程都调用了CountDownLatch对象的countDown

    8220

    Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    同时通过分析其原理,也可使我们做到知其然,并知其所以然。 这里首先来介绍一下 CountDownLatch 的用途,CountDownLatch 允许一个或一组线程等待其他线程完成后再恢复运行。 2.原理 2.1 CountDownLatch 的实现原理 CountDownLatch 的同步功能是基于 AQS 实现的,CountDownLatch 使用 AQS 中的 state 成员变量作为计数器 CountDownLatch 本身的原理并不难理解,不过如果大家想深入理解 CountDownLatch 的实现细节,那么需要先去学习一下 AQS 的相关原理。 3.1 CountDownLatch 源码分析 CountDownLatch原理不是很复杂,所以在具体的实现上,也不是很复杂。 CountDownLatch 的主要逻辑都是封装在 Sync 和其父类 AQS 里的。所以分析 CountDownLatch 的源码,本质上是分析 Sync 和 AQS 的原理

    1.4K152

    跟面试官讲解CountDownLatch源码设计原理

    CountDownLatch 是用给定的 count 初始化的。 CountDownLatch 是一种通用的同步工具,可以用于多种用途。 一个初始化为N的CountDownLatch可以用来让一个线程等待,直到N个线程完成某个动作,或者某个动作已经完成N次。 可以看出,CountDownLatch并无显式地继承什么接口或类。 2.3 构造函数细节 构造一个用给定计数初始化的CountDownLatch。 ? 参数 count 在线程通过await()之前必须调用countDown()的次数 CountDownLatch 的 state 并不是 AQS 的默认值 0,而是可赋值的,就是在 CountDownLatch

    38171

    面试官:说说CountDownLatch,CyclicBarrier,Semaphore的原理

    CountDownLatch CountDownLatch适用于在多线程的场景需要等待所有子线程全部执行完毕之后再做操作的场景。 public class CountDownLatchTest { private static int num = 3; private static CountDownLatch countDownLatch 他和join()方法的区别就是join会阻塞子线程直到运行结束,而CountDownLatch可以在任何时候让await()返回,而且用ExecutorService没法用join了,相比起来,CountDownLatch CountDownLatch基于AQS实现,volatile变量state维持倒数状态,多线程共享变量可见。 内部维护parties记录总线程数,count用于计数,最开始count=parties,调用await()之后count原子递减,当count为0之后,再次将parties赋值给count,这就是复用的原理

    25020

    CountDownLatch

    CountDownLatch简介 CountDownLatch是一个同步工具类,它使得一个或多个线程一直等待,直至其他线程的操作执行完成后再接着执行。 在Java并发中,CountDownLatch是一个常见的面试题。 CountDownLatch是什么? CountDownLatch是在JDK 1.5中引入的,存在于java.util.concurrent包下。 CountDownLatch原理的伪代码如下: 1.Main thread start 2.Create CountDownLatch for N threads 3.Create and start 其他N 个线程必须引用CountDownLatch对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。

    16330

    Java多线程并发控制工具CountDownLatch,实现原理及案例

    倒计数器的初始值在构建CountDownLatch对象时指定,它表示我们需要等待的条件个数。await方法能让线程进入等待状态,等待的条件是倒计数器的值大于0。 实现原理 先前介绍过如何基于AQS同步器实现一个自定义同步器,实际上CountdownLatch也是基于AQS来实现的,只要使用AQS的共享模式即可以轻松实现闭锁。 下面我们看详细的实现代码,CountdownLatch类的构造函数需要传入一个整型参数,表示倒计数器的初始值,对应着AQS的state状态变量。 按照官方推荐的自定义同步器的做法,将继承了AQS类的子类Sync作为CountdownLatch类的内部类,而CountdownLatch同步器中相关的操作只需代理成子类中对应的方法即可。 案例 2 第二个例子是创建一个CountdownLatch对象作为倒计数器,其值为2。

    38170

    Java并发学习之CountDownLatch实现原理及使用姿势

    CountDownLatch实现原理及使用姿势 在并发编程的场景中,最常见的一个case是某个任务的执行,需要等到多个线程都执行完毕之后才可以进行,CountDownLatch可以很好解决这个问题 下面将主要从使用和实现原理两个方面进行说明 ,围绕点如下 CountDownLatch 是个什么鬼 怎么用(结合case说明) 底层实现原理(及如何保障功能的正常性) I. await(long, TimeUnit)来替代直接使用await()方法,至少不会造成阻塞死只能重启的情况 有兴趣的小伙伴可以对比下这个实现与 《Java并发学习之ReentrantLock的工作原理及使用姿势 实现原理 同ReentrantLock一样,依然是借助AQS的双端队列,来实现原子的计数-1,线程阻塞和唤醒 前面《Java并发学习之ReentrantLock的工作原理及使用姿势》 介绍了AQS的结构 实现原理 await内部实现流程: 判断state计数是否为0,不是,则直接放过执行后面的代码 大于0,则表示需要阻塞等待计数为0 当前线程封装Node对象,进入阻塞队列 然后就是循环尝试获取锁,直到成功

    11.1K142

    CountDownLatch介绍

    有的,就是CountDownLatch 先来看个例子 public class MainActivity extends Activity { private ArrayList<Integer sb.toString()); } private void testCountDownLatch() { int threadCount = 10; final CountDownLatch latch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { CountDownLatch的作用就是主线程在等待所有其它的子线程完成后再往下执行。 它的好处就是异步写法换成了同步写法 CountDownLatch源码解析 https://www.cnblogs.com/will-shun/p/7392619.html

    22620

    CountDownLatch源码分析

    1.CountDownLatch的用法 CountDownLatch源码分析之前,首先看一看CountDownLatch的用法,我们通过一段代码来说明CountDownLatch的基本用法,代码如下。 CountDownLatch可以指定一个count,例如我们代码中指定为10,然后启动了10个线程,线程就是执行CountDownLatch的countDown方法,每执行一次,count就会减1,直到为 所以整段代码的意思就是启动main以后主线程进行阻塞,直到执行指定次数CountDownLatch的countDown方法主线程才会释放,释放主线程取决于构造函数中传递的count。 ? 到此为止CountDownLatch的countDown方法源码就结束了,我们通过流程图来总结一下。 ? 到此CountDownLatch的await方法源码分析结束,一样我们通过流程图总结一下执行流程。 ?

    23251

    CountDownLatch使用解析

    在这篇文章中,我将会涉及到在Java并发编程中跟CountDownLatch相关的以下几点: CountDownLatch是什么 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有 CountDownLatch的伪代码如下所示: //Main thread start //Create CountDownLatch for N threads //Create and start 这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。 与CountDownLatch的第一次交互是主线程等待其他线程。 Result was :: true 常见面试题 可以为你的下次面试准备以下一些CountDownLatch相关的问题: 解释一下CountDownLatch概念? CountDownLatch 和CyclicBarrier的不同之处? 给出一些CountDownLatch使用的例子? CountDownLatch 类中主要的方法?

    5720

    Java多线程之---用 CountDownLatch 说明 AQS 的实现原理

    今天就来说一下几种锁的实现原理。 先来看一个最简单的 CountDownLatch 使用方法,例子很简单,可以运行看一下效果。 例如下面这个例子,首先实例化一个 CountDownLatch ,参数可以理解为一个计数器,这里为 1,然后主线程执行,调用 worker 子线程,接着调用 CountDownLatch 的 await private static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args AQS 的原理 这么好用的功能是怎么实现的呢,下面就来说一说实现它的核心技术原理 AQS。 之所以要求子类重写这些方法,是为了让使用者(这里的使用者指 CountDownLatch 等)可以在其中加入自己的判断逻辑,例如 CountDownLatch 在 tryAcquireShared中加入了判断

    35100

    CountDownLatch的使用

    (这不是废话吗) CountDownLatch CountDownLatch是一个非常实用的多线程控制的工具。 常用的几个方法: //实例化一个倒数器,count是指定计数个数 CountDownLatch(int count) // 当count不等于0时,一直阻塞 void await() // count - 1  操作 void countDown() 接下来用CountDownLatch来完成上面的题目 代码 public class Container2 { /** * 容器,volatile @return 容器大小 */ public int size() { return list.size(); } private static CountDownLatch countDownLatch = new CountDownLatch(1); public static void main(String[] args) { Container2

    24520

    CountDownLatch的使用

    下面我们用CountDownLatch来满足我们的需求。 CountDownLatch:允许一个或多个线程等待其它线程完成操作。CountDownLatch的构造方法必须接收一个int类型的参数。 当我们调用CountDownLatch中的countDown()方法时,参数会自动减1,当参数变成0时,则不会在阻塞当前线程。 ? ? 如果CountDownLatch构造方法里的参数大于调用CountDownLatch中的countDown()方法的数量时,也就是说参数会一直不等于0。那么当前线程就会一直等待。 在实际的多线程开发中常常用CountDownLatch来满足我们上述的需求,因为它和join()相比,可以直接在线程的内部处理,而不需要在当前线程中调用join()。

    20120

    CountDownLatch 源码浅析

    CountDownLatch 介绍 CountDownLatch是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。 CountDownLatch使用给定的计数值(count)初始化。 CountDownLatch是一个通用的同步工具,它能用于许多用途。 CountDownLatch使用的是共享锁模式,由于AQS除了共享锁模式还有排他锁模式,本文仅对CountDownLatch涉及到的共享锁模式部分的内容进行介绍,关于排他锁模式的部分会在 ReentrantLock 源码分析 初始化 CountDownLatch doneSignal = new CountDownLatch(N); CountDownLatch 使用了共享锁模式。 CountDownLatch 使用了一个内部类 Sync来实现CountDownLatch的同步控制,而Sync是AQS的一个实现类,它使用AQS的状态(state)来表示count。

    44360

    相关产品

    • 手游安全

      手游安全

      手游安全( MTP)是由腾讯云移动安全团队联合腾讯游戏安全团队提供的专业手游安全解决方案。具备 24 小时安全保障能力,支持全方位多维度的防护与检测,仅需客户端 2-3 个接口调用即可完成接入,帮助手游厂商快速应对手游作弊、手游篡改破解等等常见游戏安全问题……

    相关资讯

    热门标签

    扫码关注腾讯云开发者

    领取腾讯云代金券