【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser
个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢。我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性。
所以,针对java并发核心的东西,我感觉就是一些api的调用,不需要面面俱到,只要知道每个类实现什么,如何调用就行。
1、CountDownLatch: java.util.concurrent.CountDownLatch
CountDownLatch作用:同步功能的辅助类,初始化时传入一个int类型的count值,当count计数不为0时,则当前线程呈wait状态,如果为0,则继续执行。
需要使用await()和countDown()方法进行:
调用await()方法,判断count 是否为0,如果不为0则等待(一直等到count值为0时,继续往下执行);await 还有一个api:await(long timeout,TimeUnit unit)。
调用countDown()方法将count计数减1,当count减到0时,线程继续运行。可使用getCount()方法获取count值。
对应需要同步的几个线程,需要同时使用同一个CountDownLatch实例对象。
对应countDown()方法的理解就是,相当于一辆长途汽车,只有人坐满了,才会出发(所有线程报团一起继续执行)。
在某些情况下,涉及到多个模块同步问题时,可以使用多个CountDownLatch实例实现。
2、CyclicBarrier: java.util.concurrent.CyclicBarrier
CyclicBarrier作用:与Semaphore、CountDownLatch一样,为同步辅助类。
CountDownLatch 与 CyclicBarrier 对比:
CountDownLatch:一个线程活多个线程,等待另外一个线程或者多个线程完成某个事情之后才继续执行。
CyclicBarrier:多个线程之间互相等待,任何一个线程完成之前,所有线程都必须等待。CyclicBarrier计数是加法操作,加到设定值后,重新归为0,再次循环;CountDownLatch是减法操作,不会循环。
CyclicBarrier cbRef = new CyclicBarrier( 3 , new Runnable(){/* 线程开始继续执行时操作,如打日志等 */...} );
就上面这个CyclicBarrier对象,当调用 await() 方法,则count计数加1,当count等于3时,程序继续向下执行,否则程序将呈阻塞状态。
常用方法:
await() 每凑齐指定个数线程就报团继续执行
getParties() 查看报团人数规则
getNumberWaiting() 查看已有多少线程在等待
reset() 重置
3、Phaser:java.util.concurrent.Phaser
Phaser:是对CountDownLatch 与 CyclicBarrier 的全面升级,是一个java并发api的一个重量级类。
常用api:
arriveAndAwaitAdvance() 每凑齐指定人数就报团执行一次,同一个线程可以执行多次arriveAndAwaitAdvance(),表示不同阶段的报团
arriveAndDeregister() 退出当前团,且当前团规则人数减1(报完当前团后,不再报下阶段的团)
getArrivedParties() 当前团凑足了多少人
getRegisteredParties() 获取注册的团规定人数
arrive() 使getArrivedParties()数量加1,即用一个虚拟线程占据一个线程的位置, 此虚拟线程不阻塞
register() 动态增加一个团的规定人数
bulkRegister(int parties) 动态的增加规定报团人数,是register()的多次调用版
forceTermination() 取消报团,线程执行各自代码,不再有Phaser阻塞等待情况
getUnarrivedParties() 当前还差多少线程开团,是getArrivedParties()方法的补集
isTerminated() 判断Phaser对象是否已为销毁状态
...
【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser的更多相关文章
- java 并发工具类CountDownLatch & CyclicBarrier
一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore (总结)
下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待 ...
- 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 【转】Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在j ...
- Java并发工具类 - CountDownLatch
Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...
- Java并发工具类CountDownLatch源码中的例子
Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...
- 深入浅出Java并发中的CountDownLatch
1. CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中 ...
- 带你看看Java的锁(三)-CountDownLatch和CyclicBarrier
带你看看Java中的锁CountDownLatch和CyclicBarrier 前言 基本介绍 使用和区别 核心源码分析 总结 前言 Java JUC包中的文章已经写了好几篇了,首先我花了5篇文章从源 ...
随机推荐
- mysql案例~关于mysql的配置文件个人见解
mysql 设置参数解读一 mysql的参数分为几类 1 session级别可以设置 2 global级别可以设置 3 session+global级别可以设置 4 ...
- 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
[转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...
- canny 算子python实现
1. Canny介绍 Canny算子与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法.John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标: 1 ...
- [转] bss段、data段、text段
1.前言 一个程序本质上都是由 BSS 段.DATA段.TEXT段三个组成的. 本文主要分编译时和运行时分别对 对data段 bss段 text段 堆 栈作一简要说明 2. 程序编译时概念说明 程序与 ...
- class_create(),device_create自动创建设备文件结点【转】
本文参考来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhenwenxian/archive/2010/03/28/5424434.aspx 本文转自:http://ww ...
- hdu 4348 To the moon (主席树区间更新)
传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...
- Python-css高级
1. 伪类和伪元素 1. 伪类 1. :link 2. :visited 3. :hover (重要) 4. :active 5. :focus(input标签获取光标焦点) 2. 伪元素 1. :f ...
- 欧拉函数,打表求欧拉函数poj3090
欧拉函数 φ(n) 定义:[1,N]中与N互质的数的个数 //互质与欧拉函数 /* 求欧拉函数 按欧拉函数计算公式,只要分解质因数即可 */ int phi(int n){ int ans=n; ;i ...
- 【AtCoder】全国統一プログラミング王決定戦予選/NIKKEI Programming Contest 2019
感觉最近好颓,以后不能这么颓了,要省选了,争取省选之前再板刷一面ATC??? A - Subscribers 简单容斥 #include <bits/stdc++.h> #define f ...
- Codeforces 891C Envy
Envy 感觉这种最小生成树上的啥题都差不多的解法.. #include<bits/stdc++.h> #define LL long long #define fi first #def ...