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相关推荐

  1. 并发容器J.U.C -- AQS组件(一)

    AQS简介 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类.它实现了一个FIFO的队列.底层 ...

  2. AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin

    1. J.U.C - AQS (AbstractQueuedSynchronizer) java.util.concurrent(J.U.C) 大大提高了并发性能,AQS 被认为是 J.U.C 的核心 ...

  3. 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C

    转载自 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C J.U.C J.U.C即java.util.concurrent包,为我们提供了很多高性能的并发类,可以说是java并发的核心. ...

  4. java高并发(一)导学

    现在准备系统学习java高并发与多线程相关知识. 首先了解一下我们这一套知识的学习思路: 并发与高并发相关概念 CPU多级缓存 缓存一致性 乱序执行优化 java内存模型 JMM规定.抽象结构 同步操 ...

  5. Java实现小猪佩奇_一入java深似海(1-4期 完整版)

    『课程目录』: ├─第1期 │      开篇 一入 Java 深似?,从此"劝退"成必然.mp4 │      第1节:Java语言基础.mp4 │      第2节:Java面 ...

  6. 扛过字节Java研发岗4轮面试,收到sp offer(月薪35k)!揭秘字节面试流程及考题(附带答案)

    3 轮技术面 + 1 轮 HR 面,他最终拿到了 35k*16薪 的 Offer. 第一轮主要考察 Java 基础,二.三轮注重对应技术的掌握,以及对过往项目的业务理解.之所以令他印象深刻,是因为每轮 ...

  7. java clh队列_J.U.C|同步队列(CLH)

    一.写在前面 在上篇我们聊到AQS的原理,具体参见<J.U.C|AQS原理>. 这篇我们来给大家聊聊AQS中核心同步队列(CLH). 二.什么是同步队列(CLH) 同步队列 一个FIFO双 ...

  8. 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 ...

  9. 网易面试Java开发凉凉经,面试官:基础不牢,技术不够深入,无缘offer,无缘网易......

    前言 我也是经朋友介绍来的网易,先是投了简历,然后朋友通知我说可以面试了,于是我就带着忐忑的心理来到网易公司.面试的是一位帅气的光头叔叔,下午三点开始,之前准备了很多准备应付技术问答,结果基础还是太差 ...

最新文章

  1. 新基建重点,5G时代基石,数据中心加速发展
  2. 【星球知识卡片】模型剪枝有哪些关键技术,如何对其进行长期深入学习
  3. 一文解读:如何从 0 到 1 打造小程序爆款裂变
  4. 什么才是多线程安全的
  5. 根据checkbox组的选中状态给list数组赋值
  6. mozilla js 引擎_Mozilla的内容拦截器,新JavaScript引擎以及更多开源新闻
  7. selenium2 webdriver要点理解
  8. RDD DataFrame DataSet 区别和转换
  9. Android教程 第五章 常用UI界面控件
  10. Atitit 提现功能安全条例 目录 1. 防余额篡改 1 2. 大额 频繁交易预警系统 1 3. 增加审核 流程 1 4. 增加审计 1 5. 财务出款核对 1 6. Other 2 6.1. 数
  11. 74ls20设计半加器_用74ls138设计全加器
  12. 热电阻PT100转4-20mA温度信号转换器,变送分配器
  13. C Primer Plus(6) 中文版 第9章 函数 9.1 复习函数
  14. docker搭建kong、konga步骤
  15. Java EE 及Jess安装
  16. NX二次开发-创建图纸尺寸表达式抑制UF_DRF_add_controlling_exp
  17. archlinux_安装篇
  18. css3 制作圆柱体
  19. SpringBoot2.x整合OpenOffice4
  20. MySQL数据库程序设计(二)

热门文章

  1. 用sc命令查询系统状态
  2. js动态加载HTML元素时出现的无效的点击事件
  3. WWDC心愿单:新版OS X或将有这些变化
  4. 锋神教我数据库,吴大哥教我写文档——其一
  5. IIS7 经典模式和集成模式的区别分析(转载)
  6. LAMP/LNMP环境下:phpinfo php连接mysql php执行mysql查询 测试代码及响应
  7. Facebook史上最严重宕机,全网宕机近七小时,到底是怎么回事?
  8. Object-C使用NSLog打印日志
  9. 通过as3直接操作swf文件的元件
  10. set/multiset容器