7.JUC 三大辅助类

 JUC提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多Lock锁的频繁操作。这三种辅助类为:

  • CountDownLatch:减少计数

  • Cyclicbarrier:循环栅栏

  • Semaphore:信号灯

7.1 减少计数CountDownLatch

 CountDownLatch类可以设置一个计数器,然后通过countDown方法来进行减1操作,使用await方法等待计数不大于0,然后继续执行await方法之后的语句。

  • CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。
  • 其他线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)。
  • 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。

场景:6个同学陆续离开教师后值班同学才可以关门。

/*** CountDownLatch Demo*/
public class CountDownLatchDemo {/*** 6个陆续离开教师之后,班长锁门*/public static void main(String[] args) throws InterruptedException {// 创建CountDownLathc 对象,设置初始值CountDownLatch countDownLatch = new CountDownLatch(6);// 6个同学陆续离开教室之后for (int i = 0; i < 6; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "号同学离开教室");// 计数减一countDownLatch.countDown();}, String.valueOf(i)).start();}// 等待countDownLatch.await();System.out.println(Thread.currentThread().getName() + "班长锁门走人了");}
}

7.2 循环栅栏CyclicBarrier

CycliBarrier看英文单词可以看出大概就是循环阻塞的意思,在使用Cyclicbarrier的构造方法第一个参数是目标障碍述,每次执行Cyclicbarrier一次障碍数会加一,如果达到目标障碍数,才会执行cyclicBarrier.await() 之后的语句。可以将CyclicBarrier理解为加1操作。

场景:集齐七颗七龙珠

/*** 集齐七颗龙珠,就可以召唤神龙*/
public class CyclicBarrierDemo {/*** 创建固定值*/private static final int NUMBER = 7;public static void main(String[] args) {// 创建 CyclicBarrierCyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {System.out.println("集齐7颗龙珠可以召唤神龙");});// 集齐七课龙珠过程for (int i = 1; i <= 7; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName() + "星龙珠被收集到了");// 等待cyclicBarrier.await();} catch (Exception e) {e.printStackTrace();}}, String.valueOf(i)).start();}}
}

7.3 信号灯Semaphore

 Semaphore 的构造方法中传入的第一个参数是最大信号量(可以看成最大线程池),每个信号量初始化未一个最多只能分发一个许可证,使用acquire方法获得许可证,release方法释放许可。

/*** 6 辆汽车,停3个车位*/
public class SemaphoreDemo {public static void main(String[] args) {// 创建Semaphore,设置许可数量Semaphore semaphore = new Semaphore(3);for (int i = 1; i <= 6; i++) {new Thread(() -> {try {// 抢占车位semaphore.acquire();System.out.println(Thread.currentThread().getName() + "抢到车位");// 设置随机时间TimeUnit.SECONDS.sleep(new Random().nextInt(5));System.out.println(Thread.currentThread().getName() + "------离开的车位");} catch (Exception e) {e.printStackTrace();} finally {// 释放semaphore.release();}},String.valueOf(i)).start();}}
}

7.JUC 三大辅助类相关推荐

  1. JUC并发编程之Callable接口、JUC三大辅助类

    目录 8. Callable接口 8.1 创建线程的多种方式 8.2 概述 8.3 用Callable接口创建Thred线程 8.4 小结(重点) 9. JUC 三大辅助类 9.1 概述 9.2 减少 ...

  2. JUC 高并发编程之JUC三大辅助类

    JUC 高并发编程之JUC三大辅助类 JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过 多时 Lock 锁的频繁操作.这三种辅助类为: CountDownLatch: 减少计数 ...

  3. JUC 三大辅助类解读

    目录 减少计数 CountDownLatch 构造办法 代码实战 循环栅栏 CyclicBarrier 构造器 代码实战 信号灯 Semaphore 构造办法 代码实战 JUC 中提供了三种常用的辅助 ...

  4. JUC-JUC三大辅助类

    7 JUC 三大辅助类 JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时 Lock 锁的频繁操作.这三种辅助类为: CountDownLatch: 减少计数 CyclicB ...

  5. JUC:7_2三大辅助类:CylicBarrier原理及使用、线程加法计数器

    JUC:7_2三大辅助类:CylicBarrier原理及使用.线程加法计数器 JUC:7_1三大辅助类:CountDownLatch原理及使用.线程减法计数器 什么是CyclicBarrier? 构造 ...

  6. JUC——JUC强大辅助类讲解

    文章目录 1:JUC是什么 2:倒计数器--CountDownLatchDemo 3:循环栅栏--CyclicBarrier 4:允许多个线程同时访问--Semaphore(信号量) 1:JUC是什么 ...

  7. Day127.JUC:线程间通信(Conditon)、并发容器类(CopyOnWrite)、JUC强大辅助类、Callable

    . 目录 一.线程间通信 线程间通信改造成Lock版  Condition 定制化调用通信 Condition 二.并发容器类 (解决集合安全问题) CopyOnWrite 写时拷贝技术 三.JUC ...

  8. JUC重要辅助类(同步组件及锁)

    一.CountDownLatch(计数器) 原理: CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞.其它线程调用countDown方法会将计数器减1( ...

  9. JUC常用辅助类CountDownLatch、CyclicBarrier、Semaphore

    一.CountDownLatch 简介:CountDownLatch倒计时计数锁,其主要有俩个方法,当一个或多个线程调用await()方法时,这些线程会阻塞. 其他线程调用countDown()方法会 ...

  10. JUC: 同步辅助类

    java.util.concurrent包下,有一些关于同步的辅助工具类,比如CountDownLatch.CyclicBarrier等. CountDownLatch 允许一个或多个线程等待直到在其 ...

最新文章

  1. tplink wr886n v5.0 ttl 接线方法
  2. Android项目:proguard混淆之常见开源项目混淆配置
  3. 笔记:Linux下C编程实现每隔一秒向文件中写入当前时间
  4. ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练(模型保存+可视化)实现二分类预测
  5. 【NLP】TransformerXL:因为XL,所以更牛
  6. 【LeetCode笔记 - 每日一题】375. 猜数字游戏 II (Java、DFS、动态规划)
  7. System Center Technical Preview DPM(2016)对Exchange2016的灾难恢复
  8. 6 SystemVerilog语言编写售货机
  9. Python高阶函数-闭包
  10. opencv-4.5.5-vc14_vc15配置环境VC++
  11. matlab均值滤波实现
  12. PDF编辑器中文版免费下载哪里可以下载?
  13. C51单片机程序环境搭建及第一个程序运行
  14. 微信图片怎么添加竖排文字_如何给微信图片添加上竖排文字?
  15. 化工、食品外贸行业管理难点
  16. 交换机连接控制器_MESH路由器组网指南,各种连接方法
  17. 计算机辅助翻译与人工翻译论文,浅析计算机辅助翻译与纯人工翻译的利与弊
  18. Rotation - 旋转
  19. 台式机通过网线连接笔记本的wifi网络
  20. QIIME2进阶二_元数据及数据导入QIIME2

热门文章

  1. icloud android 日历同步到iphone,Mac的日历事件如何同步到iphone-Mac的日历事件同步到iphone教程 - 河东软件园...
  2. 上网代理设置会被自动清空_代理服务器上网(代理服务器老是自动打开)
  3. 全国气象预报业务产品grib2数据格式解析
  4. 一个https神奇的故事
  5. 个人备案网站不能做博客了?
  6. 【demo】虫眼镜的制作 制作 完了 finish
  7. weblogic 启动很慢_【转】解决weblogic启动慢和创建域慢的方法
  8. python爬虫数据可视化豆瓣评分top250_Python数据可视化:豆瓣电影TOP250
  9. vue/uniapp 百度统计埋点
  10. 没有ftp信息服务器,电脑没有ftp服务器配置