J.U.C - AQS
java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心。
AbstractQueuedSynchronizer采用了出口协议的概念,位于java.util.concurrent包下的大部分状态依赖类都构建于它之上。
一、CountDownLatch
是一个同步工具类,它允许一个或多个线程等待,直到其他线程执行完之后再执行。
它维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。
public class CountdownLatchExample {public static void main(String[] args) throws InterruptedException {final int totalThread = 10;CountDownLatch countDownLatch = new CountDownLatch(totalThread);ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < totalThread; i++) {executorService.execute(() -> {System.out.print("run..");countDownLatch.countDown();});}countDownLatch.await();System.out.println("end");executorService.shutdown();}
}
输出
run..run..run..run..run..run..run..run..run..run..end
二、CyclicBarrier
用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。
和 CountdownLatch 相似,都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 await() 方法而在等待的线程才能继续执行。
CyclicBarrier 和 CountdownLatch 的一个区别是,CyclicBarrier 的计数器通过调用 reset() 方法可以循环使用,所以它才叫做循环屏障。
CyclicBarrier 有两个构造函数,其中 parties 指示计数器的初始值,barrierAction 在所有线程都到达屏障的时候会执行一次。
public CyclicBarrier(int parties, Runnable barrierAction) {if (parties <= 0) throw new IllegalArgumentException();this.parties = parties;this.count = parties;this.barrierCommand = barrierAction;
}public CyclicBarrier(int parties) {this(parties, null);
}
public class CyclicBarrierExample {public static void main(String[] args) {final int totalThread = 10;CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < totalThread; i++) {executorService.execute(() -> {System.out.print("before..");try {cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}System.out.print("after..");});}executorService.shutdown();}
}
before..before..before..before..before..before..before..before..before..before..after..after..after..after..after..after..after..after..after..after..
Semaphore
Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。
以下代码模拟了对某个服务的并发请求,每次只能有 3 个客户端同时访问,请求总数为 10。
public class SemaphoreExample {public static void main(String[] args) {final int clientCount = 3;final int totalRequestCount = 10;Semaphore semaphore = new Semaphore(clientCount);ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < totalRequestCount; i++) {executorService.execute(()->{try {semaphore.acquire();System.out.print(semaphore.availablePermits() + " ");} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}});}executorService.shutdown();}
}
输出
2 1 2 2 2 2 2 1 2 2
J.U.C - AQS相关推荐
- 并发容器J.U.C -- AQS组件(一)
AQS简介 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类.它实现了一个FIFO的队列.底层 ...
- AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin
1. J.U.C - AQS (AbstractQueuedSynchronizer) java.util.concurrent(J.U.C) 大大提高了并发性能,AQS 被认为是 J.U.C 的核心 ...
- 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C
转载自 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C J.U.C J.U.C即java.util.concurrent包,为我们提供了很多高性能的并发类,可以说是java并发的核心. ...
- java高并发(一)导学
现在准备系统学习java高并发与多线程相关知识. 首先了解一下我们这一套知识的学习思路: 并发与高并发相关概念 CPU多级缓存 缓存一致性 乱序执行优化 java内存模型 JMM规定.抽象结构 同步操 ...
- Java实现小猪佩奇_一入java深似海(1-4期 完整版)
『课程目录』: ├─第1期 │ 开篇 一入 Java 深似?,从此"劝退"成必然.mp4 │ 第1节:Java语言基础.mp4 │ 第2节:Java面 ...
- 扛过字节Java研发岗4轮面试,收到sp offer(月薪35k)!揭秘字节面试流程及考题(附带答案)
3 轮技术面 + 1 轮 HR 面,他最终拿到了 35k*16薪 的 Offer. 第一轮主要考察 Java 基础,二.三轮注重对应技术的掌握,以及对过往项目的业务理解.之所以令他印象深刻,是因为每轮 ...
- java clh队列_J.U.C|同步队列(CLH)
一.写在前面 在上篇我们聊到AQS的原理,具体参见<J.U.C|AQS原理>. 这篇我们来给大家聊聊AQS中核心同步队列(CLH). 二.什么是同步队列(CLH) 同步队列 一个FIFO双 ...
- 92. 你说你精通Java并发,那给我讲讲JUC吧
你说你精通Java并发,那给我讲讲J.U.C吧 J.U.C J.U.C和CAS和Unsafe和AQS J.U.C框架 Atomic Locks Collections Executor Tools J ...
- 网易面试Java开发凉凉经,面试官:基础不牢,技术不够深入,无缘offer,无缘网易......
前言 我也是经朋友介绍来的网易,先是投了简历,然后朋友通知我说可以面试了,于是我就带着忐忑的心理来到网易公司.面试的是一位帅气的光头叔叔,下午三点开始,之前准备了很多准备应付技术问答,结果基础还是太差 ...
最新文章
- 新基建重点,5G时代基石,数据中心加速发展
- 【星球知识卡片】模型剪枝有哪些关键技术,如何对其进行长期深入学习
- 一文解读:如何从 0 到 1 打造小程序爆款裂变
- 什么才是多线程安全的
- 根据checkbox组的选中状态给list数组赋值
- mozilla js 引擎_Mozilla的内容拦截器,新JavaScript引擎以及更多开源新闻
- selenium2 webdriver要点理解
- RDD DataFrame DataSet 区别和转换
- Android教程 第五章 常用UI界面控件
- Atitit 提现功能安全条例 目录 1. 防余额篡改	1 2. 大额 频繁交易预警系统	1 3. 增加审核 流程	1 4. 增加审计	1 5. 财务出款核对	1 6. Other	2 6.1. 数
- 74ls20设计半加器_用74ls138设计全加器
- 热电阻PT100转4-20mA温度信号转换器,变送分配器
- C Primer Plus(6) 中文版 第9章 函数 9.1 复习函数
- docker搭建kong、konga步骤
- Java EE 及Jess安装
- NX二次开发-创建图纸尺寸表达式抑制UF_DRF_add_controlling_exp
- archlinux_安装篇
- css3 制作圆柱体
- SpringBoot2.x整合OpenOffice4
- MySQL数据库程序设计(二)