countdownlatch

JUC并发包基本使用

╄→гoц情女王★ 提交于 2019-12-01 19:19:14
一、简介   传统的Java多线程开发中,wait、notify、synchronized等如果不注意使用的话,很容易引起死锁、脏读问题。Java1.5 版本开始增加 java.util.concurrent 并发编程包,简化了多线程开发难度。添加了很多的多线程操作工具类,可根据实际需求去选择使用。   JUC 常用工具类:   Semaphore - 信号量   ReentrantLock - 可重入锁。之前有做过简介使用,详见 https://www.cnblogs.com/eric-fang/p/8991208.html   ReadWriteLock - 读写锁   BlockingQueue - 阻塞队列。详见 https://www.cnblogs.com/eric-fang/p/8989860.html   CountDownLatch - 计数器。在计数器归零后,允许之前阻塞的若干线程继续执行   CyclicBarrier - 栅栏。在某一条件达成之前,所有线程均阻塞等待   AtomicXXXXXXX - 原子操作类,常见的有:AtomicInteger、AtomicLong、AtomicBoolean。   TimeUnit - 时间枚举类,提供一些时间的便捷操作   Executor、ExecutorService、Future : 之前有做过简介使用,详见

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

女生的网名这么多〃 提交于 2019-12-01 15:47:13
前言:   前面讲完了一些并发编程的原理,现在我们要来学习的是线程之间的协作。通俗来说就是,当前线程在某个条件下需要等待,不需要使用太多系统资源。在某个条件下我们需要去唤醒它,分配给它一定的系统资源,让它继续工作。这样能更好的节约资源。 一、Object的wait()与notify()    基本概念:     一个线程因执行目标动作的条件未能满足而被要求暂停就是wait,而一个线程满足执行目标动作的条件之后唤醒被暂停的线程就是notify。    基本模板: synchronized (obj){ //保护条件不成立 while(flag){ //暂停当前线程 obj.wait(); } //当保护条件成立,即跳出while循环执行目标动作 doAction(); }    解析wait(): Object.wait()的作用是使执行线程被暂停,该执行线程生命周期就变更为WAITING,这里注意一下,是 无限等待 ,直到有notify()方法通知该线程唤醒。Object.wait(long timeout)的作用是使执行线程超过一定时间没有被唤醒就自动唤醒,也就是 超时等待 。Object.wait(long timeout,int naous)是更加精准的控制时间的方法,可以控制到毫微秒。 这里需要注意的是wait(

并发新构件之CountDownLatch

不问归期 提交于 2019-12-01 15:29:08
CountDownLatch译为倒计时锁存器:JDK描述 ;允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。 A CountDownLatch 用给定的 计数 初始化。 await 方法阻塞,直到由于 countDown() 方法的 调用 而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的 await 调用立即 返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用 CyclicBarrier 。 典型用法1:某一线程运行前,等待其他N个线程运行完(countDown()方法被调用N次)。例如:司机(主线程)开车前,等待所有人(其他线程)上车,主线程在await(),其他线程执行coutndown()。 典型用法2:实现多个线程开始执行任务的最大并行性。例如 裁判(主线程)开枪,多个运动员(其他线程)开跑,主线程执行countDown(),其他线程await()在等待; 简单示例: package com.houjun.current.newClassBank; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;

Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

时间秒杀一切 提交于 2019-12-01 12:56:57
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 在 java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一 .CountDownLatch用法 二 .CyclicBarrier用法 三 .Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正。 一 .CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 CountDownLatch类只提供了一个构造器: public CountDownLatch(int count) { }; //参数count为计数值 然后下面这 3个方法是CountDownLatch类中最重要的方法: public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行 public boolean

四、线程的并发工具类

[亡魂溺海] 提交于 2019-12-01 12:50:15
线程的并发工具类 一、CountDownLatch 【1】CountDownLatch是什么? CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行: 确保某个计算在其需要的所有资源都被初始化之后才继续执行; 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; 等待直到某个操作所有参与者都准备就绪再继续执行; CountDownLatch有一个正数计数器,countDown()方法对计数器做减操作,await()方法等待计数器达到0。所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。 闭锁(倒计时锁)主要用来保证完成某个任务的先决条件满足。是一个同步工具类,用来协调多个线程之间的同步。这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行。 【2】CountDownLatch的两种典型 用法 ① 某一线程在开始运行前等待n个线程执行完毕。 将 CountDownLatch 的计数器初始化为n :new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownlatch.countDown(),当计数器的值变为0时

CountDownLatch使用以及原理

与世无争的帅哥 提交于 2019-12-01 08:09:16
概述 CountDownLatch是一个用来控制并发的很常见的工具,它允许一个或者多个线程等待其他的线程执行到某一操作,比如说需要去解析一个excel的数据,为了更快的解析则每个sheet都使用一个线程去进行解析,但是最后的汇总数据的工作则需要等待每个sheet的解析工作完成之后才能进行,这就可以使用CountDownLatch。 CountDownLatch是java.util.concurrent包中一个类,CountDownLatch只要提供的机制是多个(具体数量等于初始化CountDownLatch时count的值)线程都达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。等待的线程可以是多个,即CountDownLatch可以唤醒多个等待的线程。到达自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。 这里写图片描述 结合以下几个例子,可以快速掌握这个这个类的基本使用方法: 例一: public static void main(String[] args) throws InterruptedException { CountDownLatch countDown = new CountDownLatch(1); CountDownLatch

枚举加countdownLatch的使用

混江龙づ霸主 提交于 2019-12-01 07:15:49
package com.cxy.juc; import java.util.concurrent.CountDownLatch; public class CountDownlatchDemo { public static void main(String[] args) { CountDownLatch countDownLatch =new CountDownLatch(6); for (int i = 1; i <=6 ; i++) { new Thread(()->{ System.out.println("1"+"\t"+Thread.currentThread().getName()); countDownLatch.countDown(); },Count.fore(i).getMsg()).start(); } try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2"); } } package com.cxy.juc; import com.sun.javafx.scene.control.behavior.TwoLevelFocusBehavior; public enum Count { ONE

使用Semaphore限制资源并发访问的线程数

限于喜欢 提交于 2019-12-01 05:11:16
从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文将介绍用来控制资源同时访问个数的Semaphore工具类, 然后采用Semaphore给出一个泊车的实例,最后给出 Semaphore 和 CountDownLatch 的几点比较。 Semaphore工具类介绍 Semaphore类描述 /** * A counting semaphore. Conceptually, a semaphore maintains a set of * permits. Each {@link #acquire} blocks if necessary until a permit is * available, and then takes it. Each {@link #release} adds a permit, * potentially releasing a blocking acquirer. * However, no actual permit objects are used; the <tt>Semaphore</tt> just * keeps a count of the number available and acts accordingly. * * <p>Semaphores are often used

Java 并发之 AbstractQueuedSynchronizer

前提是你 提交于 2019-12-01 04:45:09
如果你读过 JUC 中 ReentrantLock、CountDownLatch、FutureTask、Semaphore 等的源代码,会发现其中都有一个名为 Sync 的类,而这个类是以 AbstractQueuedSynchronizer 为基础的,所以说 AbstractQueuedSynchronizer 是 JUC 的基础之一(注:CyclicBarrier 并没有直接以 AQS 为基础)。出于知其然也要知其所以然的目的,我学习了 AQS 的实现原理,并总结成此文。 数据结构 在 AQS 中,有两个重要的数据结构,一个是 volatile int state,另一个是 class Node 组成的双向链表。 int state 顾名思义,这个变量是用来表示 AQS 的状态的,例如 ReentrantLock 的锁的状态和重入次数、FutureTask 中任务的状态、CountDownLatch 中的 count 计数等等。这个值的更新都是由 AQS compareAndSetState 方法来实现的,而这个方法则是通过 Compare and Swap 算法实现,至于这个算法的细节就不多说了。在 JDK 中,这个算法是由 Native 方法实现的。 Node 双向链表 Node 是 AQS 的一个内部类,主要有 waitStatus、prev、next、thread

concurrent包的同步器

梦想与她 提交于 2019-12-01 04:44:55
concurrent包的同步器:CountDownLatch、CyclicBarrier、Semaphore 同步器简介 名称 功能 构成 主要方法 CountDownLatch(闭锁) 一个线程等待其它线程完成各自工作后在执行 继承aqs await()/countDown() CyclicBarrier (循环屏障) 一组线程协同工作 ReentrantLock await() Semaphore(信号) 控制同时访问特定资源的线程数量 继承aqs acquire()/release() CountDownLatch(闭锁) 一个线程等待其它线程完成各自工作后在执行。例如:主线程希望复制启动框架服务的线程已经启动索引的框架服务在执行。 例如:主线程希望复制启动框架服务的线程已经启动索引的框架服务在执行。 开始执行前等待n个线程完成各自任务。 死锁检测 核心源码 public class CountDownLatch { /** * Synchronization control For CountDownLatch. * Uses AQS state to represent count. */ private static final class Sync extends AbstractQueuedSynchronizer { private static final