JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html

JUC学习笔记(二)https://www.cnblogs.com/lm66/p/15118813.html

JUC学习笔记(三)https://www.cnblogs.com/lm66/p/15118976.html

JUC学习笔记(四)https://www.cnblogs.com/lm66/p/15122281.html

JUC学习笔记(五)https://www.cnblogs.com/lm66/p/15123516.html

1、JUC 三大辅助类

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

  • CountDownLatch: 减少计数
  • CyclicBarrier: 循环栅栏
  • Semaphore: 信号灯

1.1、减少计数 CountDownLatch

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

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

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

CountDownLatchDemo

public class CountDownLatchDemo {

    public static void main(String[] args) throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 1; i <= 6; i++) {
final int j = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 同学离开教室");
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("班长关门");
}
}

1.2、循环栅栏 CyclicBarrier

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

场景: 集齐 7 颗龙珠就可以召唤神龙

CyclicBarrierDemo

public class CyclicBarrierDemo {

    public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("成功召唤神龙");
});
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();
}
}
}

1.3、信号灯 Semaphore

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

场景: 抢车位, 6 部汽车 3 个停车位

SemaphoreDemo

public class SemaphoreDemo {

    public static void main(String[] args) {
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();
}
}
}

最新文章

  1. Oozie分布式任务的工作流——Spark篇
  2. .NET正则表达式基础入门(一)
  3. CSS3 rgba
  4. pythonchallenge(一)
  5. Java基础知识强化之IO流笔记80:NIO之 ServerSocketChannel
  6. HDOJ/HDU 1200 To and Fro(加密解密字符串)
  7. 用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发
  8. T-SQL 查询语句总结
  9. R包——ggplot2(二)
  10. html向servlet传乱码解决办法
  11. boost.xml_parser中文字符问题
  12. nopCommerce安装教程
  13. 【读书笔记】【深入理解ES6】#13-用模块封装代码
  14. 一些关于IO流的问题
  15. Oracle学习笔记四
  16. 微信小程序布局
  17. LINUX内核设计第五周——扒开系统调用的三层皮(下)
  18. 【题解】Luogu P2604 [ZJOI2010]网络扩容
  19. canvas绘图在手机上边缘粗糙
  20. linux下用命令修改文件内容

热门文章

  1. 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件
  2. vscode 配置 Pug Compile Hero Pro 插件步骤
  3. Kubernetes之deployment
  4. 乘风破浪,Windows11官方原装4K壁纸,前卫的艺术数字设计
  5. CentOS8安装GNOME3桌面并设置开机启动图形界面
  6. 01 Linux系统配置初始化
  7. 手把手教会你远程Linux虚拟机连接以及配置pytorch环境。
  8. Postgresql常见操作命令
  9. mysql 深度解析auto-increment自增列&quot;Duliplicate key&quot;问题
  10. 在CentOS7环境下部署weblogic集群