6.1 CountDownLatch

6.1.1 基本概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qp6uFu8K-1614138326808)(https://guardwhy.oss-cn-beijing.aliyuncs.com/img/javaSE/se2/33-javase.png)]

6.1.2 底层源码

6.1.3 代码示例

package cn.guardwhy.juc01;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo01 {public static void main(String[] args) throws InterruptedException {// 1.创建countDownLatch对象CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 0; i <=6 ; i++) {new Thread(()->{System.out.println(Thread.currentThread().getName() + " Start");// 数量-1countDownLatch.countDown();}, String.valueOf(i)).start();}// 等待计数器归零,然后再往下执行。countDownLatch.await();System.out.println("End..");}
}

原理分析

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

6.2 CyclicBarrier

6.2.1 基本概念

加法计数器

6.2.2 代码示例

package cn.guardwhy.juc01;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo01 {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{System.out.println("NBA王朝成立");});for (int i = 0; i <=7 ; i++) {int temp = i;new Thread(()->{System.out.println(Thread.currentThread().getName() + "拿到" + temp + "个总冠军");try {// 等待操作cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}).start();}}
}

6.3 Semaphore

6.3.1 基本概念

信号量;信号灯;信号

6.3.2 代码示例

package cn.guardwhy.juc01;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class SemaphoreDemo01 {public static void main(String[] args) {// 线程数量Semaphore semaphore = new Semaphore(3);// 多线程for (int i = 0; i <=5 ; i++) {new Thread(()->{try {// acquire() 得到semaphore.acquire();System.out.println(Thread.currentThread().getName() + "抢到车位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName() + "离开车位");} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放资源semaphore.release();}}).start();}}
}

6.3.3 原理分析

CyclicBarrier:指定个数线程执行完毕再执行操作。

semaphore:同一时间只能有指定数量个得到线程。

在信号量上两种操作

acquire(获取)

  • 当一个线程调用 acquire 操作时,他要么通过成功获取信号量(信号量-1)
  • 要么一直等下去,直到有线程释放信号量,或超时。

release (释放)

  • 实际上会将信号量的值 + 1,然后唤醒等待的线程。
  • 信号量主要用于两个目的:一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

作用: 多个共享资源互斥的使用,并发限流,控制最大的线程数!!!

JUC- 常用辅助类相关推荐

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

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

  2. 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁

    浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...

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

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

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

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

  5. JUC介绍--常用辅助类(CountDownLatch CyclicBarrier Semaphore)

    CountDownLatch减法计数器 每次有线程调用countDownLatch.countDown()数量就-1 数量减到0时,countDownLatch.await()会被唤醒,继续向下执行 ...

  6. JUC 常用 4 大并发工具类

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是JUC? JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西 该包的位置位 ...

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

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

  8. JUC 三大辅助类解读

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

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

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

  10. JUC: 同步辅助类

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

最新文章

  1. CCBPM工作流引擎的消息机制与设计
  2. JavaScript里的循环方法:forEach,for-in,for-of
  3. 从银行网点拒绝普通客户 看互联网银行的“微众市场
  4. linux学习笔记4:linux的任务调度,进程管理,mysql的安装和使用,ssh工具的使用,linux网络编程...
  5. BZOJ4912 SDOI2017天才黑客(最短路+虚树)
  6. arduino蓝牙通讯代码_蓝牙4.0模块 无线数据传输模块 无线蓝牙串口 Arduino
  7. opencv threshold_基于深度学习OpenCV与python进行字符识别
  8. SpringBoot 2.1.5(38)---热部署(devtools)配置操作
  9. SAP License:SAP S/4HANA Cloud [ERP 云]
  10. C语言能够被替换吗?
  11. Linux软件包管理器
  12. 贴片电容器容量怎么换算?
  13. stm32 代码加密
  14. 【每日爬虫】:生产者与消费者模式爬取王者荣耀壁纸
  15. Visio 常用的快捷键
  16. 华为云主机无法ping通外网,xshell远程连接不上
  17. 编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
  18. scrapy框架下的豆瓣电影评论爬取以及登录,以及生成词云和柱状图
  19. JavaScript => JavaScript编码规范指南
  20. 【Tomcat】tomcat logs 目录下各日志文件的含义

热门文章

  1. winhex万能恢复磁盘数据
  2. 5角星画法 android,Android Canvas绘制正多边形和正多角星
  3. mac 快速显示/隐藏隐藏文件快捷键
  4. 摄影欣赏:30幅五光十色的精美秋天风景摄影作品
  5. 递归解决卖桃子问题java
  6. 服务器空岛怎么修改地形,《迷你世界》2021空岛地形码如何输入 空岛地形码介绍...
  7. 这几款图片格式转换器帮助你轻松解决图片转换难题
  8. 使用svn报错之An error occurred while contacting the repository
  9. 程序员学炒股(3) 个股和大盘的关系之二
  10. P1004 方格取数