猿灯塔-Phaser 使用介绍
原创申明:本文由公众号【猿灯塔】原创,转载请说明出处标注
其实我对这个需要多少时间很没概念,有没有读者愿意记录下所花费的时间,在评论区反馈一下。
使用示例
// 1. 设置 count 为 1
CountDownLatch latch = new CountDownLatch(1); for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
// 2. 每个线程都等在栅栏这里,等待放开栅栏,不会因为有些线程先启动就先跑路了
latch.await(); // doWork(); } catch (InterruptedException ignore) {
}
}).start();
} doSomethingELse(); // 确保在下面的代码执行之前,上面每个线程都到了 await() 上。 // 3. 放开栅栏
latch.countDown();
简单回顾一下 CountDownLatch 的原理:AQS 共享模式的典型使用,构造函数中的 1 是设置给 AQS 的 state 的。latch.await() 方法会阻塞,而 latch.countDown() 方法就是用来将 state-- 的,减到 0 以后,唤醒所有的阻塞在 await() 方法上的线程。
// 1. 构造函数中指定了 10 个 parties
CyclicBarrier barrier = new CyclicBarrier(10); for (int i = 0; i < 10; i++) {
executorService.submit(() -> {
try {
// 2. 每个线程"报告"自己到了,
// 当第10个线程到的时候,也就是所有的线程都到齐了,一起通过
barrier.await(); // doWork() } catch (InterruptedException | BrokenBarrierException ex) {
ex.printStackTrace();
}
});
}
CyclicBarrier 的原理不是 AQS 的共享模式,是 AQS Condition 和 ReentrantLock 的结合使用
Phaser phaser = new Phaser();
// 1. 注册一个 party
phaser.register(); for (int i = 0; i < 10; i++) { phaser.register(); executorService.submit(() -> {
// 2. 每个线程到这里进行阻塞,等待所有线程到达栅栏
phaser.arriveAndAwaitAdvance(); // doWork()
});
}
phaser.arriveAndAwaitAdvance();
这里和 CyclicBarrier 是一个意思,凑齐了所有的线程,一起通过栅栏。 Phaser 也有周期的概念,一个周期定义为一个 phase,从 0 开始。
Phaser 介绍
重要接口介绍
public Phaser(int parties) {
this(null, parties);
}
public int register() {
return doRegister(1);
}
这个方法会使得 parties 加 1
public int bulkRegister(int parties) {
if (parties < 0)
throw new IllegalArgumentException();
if (parties == 0)
return getPhase();
return doRegister(parties);
}
一次注册多个,这个方法会使得 parties 增加相应数值
大家要理解一点,party 本和线程是没有关系的,不能说一个线程代表一个 party,因为我们完全可以在一个线程中重复调用 arrive() 方法。这么表达纯粹是方便理解用。
protected boolean onAdvance(int phase, int registeredParties) {
return phase >= N || registeredParties == 0;
}
1、我们可以通过 phaser.isTerminated() 来检测一个 phaser 实例是否已经终结了 2、当一个 phaser 实例被终结以后,register()、arrive() 等这些方法都没有什么意义了,大家可以玩一玩,观察它们的返回值,原本应该返回 phase 值的,但是这个时候会返回一个负数。
Phaser 的监控方法
Phaser 的分层结构
/**
* 0-15: unarrived
* 16-31: parties, 所以一个 phaser 实例最大支持 2^16-1=65535 个 parties
* 32-62: phase, 31 位,那么最大值是 Integer.MAX_VALUE,达到最大值后又从 0 开始
* 63: terminated
*/
private volatile long state;
通常我们在说 0-15 位这种,说的都是从低位开始的
Phaser root = new Phaser(5); Phaser n1 = new Phaser(root, 5);
Phaser n2 = new Phaser(root, 5); Phaser m1 = new Phaser(n1, 5);
Phaser m2 = new Phaser(n1, 5);
Phaser m3 = new Phaser(n1, 5); Phaser m4 = new Phaser(n2, 5);
- m1、m2、m3、m4 的 parties 为 5
- n1 的 parties 为 5 + 3,n2 的 parties 为 5 + 1
- root 的 parties 为 5 + 2
Phaser m5 = new Phaser(n2);
System.out.println("n2 parties: " + n2.getRegisteredParties());
m5.register();
System.out.println("n2 parties: " + n2.getRegisteredParties());
m5.arriveAndDeregister();
System.out.println("n2 parties: " + n2.getRegisteredParties());
还有一点有趣的是(其实也不一定有趣吧),在非树的结构中,此时 m5 应该处于 terminated 状态,因为它的 parties 降为 0 了,不过在树的结构中,这个状态由 root 控制,所以我们依然可以执行 m5.register()...
365天干货不断微信搜索「猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板
猿灯塔-Phaser 使用介绍的更多相关文章
- 猿灯塔:关于Java面试,你应该准备这些知识点
自天子以至于庶人,壹是皆以修身为本 <礼记·大学> 马老师说过,员工的离职原因很多,只有两点最真实: 钱,没给到位 心,受委屈了 当然,我是想换个平台,换个方向,想清楚为什么要跳槽,如果真 ...
- 猿灯塔:疫情冲击,去体验远程面试被怼10分钟,今年Java开发找工作真难
网行业,美团王兴曾说:“2019年可能会是过去十年里最差的一年,却是未来十年里最好的一年”.没想到预言竟然快成真了? 年前很多企业一波裁员,2020年又受疫情影响,延长了假期,各大企业复工时间拉长,招 ...
- 猿灯塔:最详细Dubbo相关面试题!
1.Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目. 面试官问你如果这个都不清楚,那下面的就没必要问了. 官网: ...
- 猿灯塔:Java程序员月薪三万,需要技术达到什么水平?
最近跟朋友在一起聚会的时候,提了一个问题,说Java程序员如何能月薪达到二万,技术水平需要达到什么程度?人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿二万的不太 ...
- Netty 源码解析(三): Netty 的 Future 和 Promise
今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...
- 一行一行源码分析清楚AbstractQueuedSynchronizer
“365篇原创计划”第二十四篇. 今天呢!灯塔君跟大家讲: 一行一行源码分析清楚AbstractQueuedSynchronizer 在分析 Java 并发包 java.util.concurren ...
- Netty 源码解析(九): connect 过程和 bind 过程分析
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第九篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...
- Netty 源码解析(八): 回到 Channel 的 register 操作
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第八篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...
- Netty 源码解析(七): NioEventLoop 工作流程
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第七篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...
随机推荐
- Java实现 蓝桥杯 历届试题 城市建设
问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在 ...
- java实现第七届蓝桥杯取球博弈
题目9.取球博弈 取球博弈 两个人玩取球的游戏. 一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目. 如果无法继续取球,则游戏结束. 此时,持有奇数个球的一方获胜. 如果两 ...
- java实现第六届蓝桥杯加法变乘法
加法变乘法 题目描述 我们都知道:1+2+3+ - + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+-+1011+12+-+2728+29+- ...
- 记一次discuz修改首页图片路径问题
1.找到图片路径拼装文件 首先打开根目录下的template目录找到首页文件 打开后找到图片列表的拼装位置 // 链接示例: <!--{eval $imagelistkey = getforum ...
- HDU - 2639 Bone Collector II 题解
题目大意 一个人收藏骨头,有 n 个骨头,每个骨头有体积和价值,问能够装在容量为 V 的背包中,能获得的第 k 大(去重后)价值是多少. 样例 样例输入 1 5 10 2 1 2 3 4 5 5 4 ...
- C#数据结构与算法系列(二):稀疏数组(SparseArray)
1.介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值 2.把具有不同值的元素的 ...
- Python正则式 - re
目录 1. 相关概念 1.1. rstring 1.2. 元字符 2. 模式Pattern 2.1. re.flag 3. API 4. 其他 4.1. 单词边界 '\b' 4.2. 贪婪和非贪婪 4 ...
- 不知道这些,你以为你还能devops?
一.什么是devops 在DevOps之前,从业人员使用瀑布模型或敏捷开发模型进行软件项目开发:瀑布模型或顺序模型是软件开发生命周期(SDLC)中的一种开创性方法,在这个模型中,软件开发成为一个线性过 ...
- XAI/MLI 可解释机器学习系列1- 开源&paper汇总
一直在关注可解释机器学习领域,因为确实在工作中有许多应用 模型检查,特征重要性是否符合预期和AUC一样重要 模型解释,比起虚无缥缈的模型指标,解释模型学到的规律更能说服业务方 样本解释,为什么这些用户 ...
- centos7 hive 单机模式安装配置
前言:由于只是在自己的虚拟机上进行学习,所以对hive只是进行最简单的配置,其他复杂的配置文件没有配置. 1.前提 1.1 安装配置jdk1.8 1.2 安装hadoop2.x hadoop单机模式安 ...