并发-6-wait、notify、Semaphore、CountDownLatch、CyclicBarrier
wait()、notify()和notifyAll()是Object类中的方法:
为什么wait()等方法是在Object中而不是Thread中呢?
同理,wait(),notify()是对等待这个Object(锁)的线程进行阻塞,唤醒等操作的,当然也要放在Object中
假设,wait(),notify()放在Thead中,那么Thread可能等待很多个锁,操作起来也很复杂
如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)
调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor,然后进入等待状态,等待后续再次获得此对象的锁(Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁)
同样地,调用某个对象的notify()方法,当前线程也必须拥有这个对象的monitor,因此调用notify()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)
进阶一信号量
Java 提供了经典信号量(Semaphore)的实现,通过控制一定数量的允许(permit)的方式,来达到限制通用资源访问的目的。 你可以想象一下这个场景,在车站、机场等出租车时,当很多空出租车就位时,为防止过度拥挤,调度员指挥排队,等待坐车的队伍一次进来5个人上车, 等这5个人坐车出发,再放进去下一批 当信号量的大小为1时,与synchronized没有区别
public class SemaphoreTest {private static Semaphore semaphore = new Semaphore(5);public static void main(String[] args) {for (int i = 0; i < 10; i++) {new CarWorker(semaphore).start();}}
}class CarWorker extends Thread {private Semaphore semaphore;public CarWorker(Semaphore semaphore) {this.semaphore = semaphore;}@Overridepublic void run() {try {out.println(Thread.currentThread() + " waiting permitted");semaphore.acquire();out.println(Thread.currentThread() + " on car !");Thread.sleep(10000);} catch (Exception e) {} finally {out.println(Thread.currentThread() + " release permitted");semaphore.release();}}
}
复制代码
进阶-CountDownLatch
一次性使用的计数器,当CountDownLatch中数值为0时,所有await的线程得到唤醒 特别适合于A线程需要等待B和C线程的结果作为参数的这种场景
public class CountDownLatchTest {public static void main(String[] args) {CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 0; i < 5; i++) {new FirstBatchPassenger(countDownLatch).start();}for (int i = 0; i < 5; i++) {new SecondBatchPassenger(countDownLatch).start();}while (countDownLatch.getCount() != 1) {try {Thread.sleep(1000);} catch (InterruptedException e) {}}out.println("MainThread countDown!");countDownLatch.countDown();}
}class FirstBatchPassenger extends Thread {private CountDownLatch countDownLatch;public FirstBatchPassenger(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {out.println("FirstBatchPassenger Executed!");countDownLatch.countDown();}
}class SecondBatchPassenger extends Thread {private CountDownLatch countDownLatch;public SecondBatchPassenger(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {try {countDownLatch.await();out.println("SecondBatchPassenger Executed!");} catch (InterruptedException e) {}}
}
复制代码
输出:
FirstBatchPassenger Executed!
FirstBatchPassenger Executed!
FirstBatchPassenger Executed!
FirstBatchPassenger Executed!
FirstBatchPassenger Executed!
MainThread countDown!
SecondBatchPassenger Executed!
SecondBatchPassenger Executed!
SecondBatchPassenger Executed!
SecondBatchPassenger Executed!
SecondBatchPassenger Executed!
复制代码
进阶三-CyclicBarrier
触发屏障,当await自动达到屏障数量时,触发屏障操作。可重复使用!
public class CyclicBarrierTest {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> out.println("Action GO!"));for (int i = 0; i<6;i++){new CyclicBarrierWorker(cyclicBarrier).start();}}
}class CyclicBarrierWorker extends Thread {private CyclicBarrier cyclicBarrier;public CyclicBarrierWorker(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {out.println("Executed!");try {cyclicBarrier.await();} catch (InterruptedException e) {} catch (BrokenBarrierException e) {}}
}
复制代码
输出:
Executed!
Executed!
Executed!
Action GO!
Executed!
Action GO!
Executed!
Executed!
Action GO!
复制代码
并发-6-wait、notify、Semaphore、CountDownLatch、CyclicBarrier相关推荐
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...
1.Semaphore 信号量 Semaphore(信号量)是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphore的内部计数 ...
- Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信).Semaphore(控制方法被线程访问的数量),他们 ...
- Java并发工具类(闭锁CountDownLatch)
并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...
- 并发编程系列之Semaphore
前言 上节我们介绍了Java中的并发工具类CountDownLatch和Cyclicbarrier,今天我们再来说说另外两个并发工具类:Semaphore(信号量)和Exchanger(交换者),首先 ...
- 并发工具类(三)控制并发线程数的Semaphore
http://ifeve.com/concurrency-semaphore/ 简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很 ...
- JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...
- (面经总结)一篇文章带你完整复习 Java 中并发关键字(CountDownLatch/CyclicBarrier/Semaphore/Volatile)
文章目录 一.倒计数器:CountDownLatch 二.循环栅栏:CyclicBarrier 三.信号量:Semaphore 四.volatile 关键字的作用 一.倒计数器:CountDownLa ...
- java并发编程同步器 Semaphore、CyclicBarrier、Exchanger、CountDownLatch
为什么80%的码农都做不了架构师?>>> 一.Semaphore(信号量) 注解:信号量,其实就是定义一定的数量,只有释放一个才能进去下一个,其余都得进入等待状态.比如有2个洗 ...
- Java并发工具类:CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser
本文目录: 1.CountDownLatch(闭锁) 1.CountDownLatch 例子 2.CyclicBarrier(循环栅栏) 1.CyclicBarrier 例子 2.CountDownL ...
最新文章
- 程序员吐槽:在阿里工作带来光环,在京东却带来负面影响!
- 边缘计算 — 与 5G
- final关键字的几大特征
- android主板接口定义,范例解析:学习Android的IPC主板模式
- 让未备案的网站先飙起来
- WebForm 分页与组合查询
- 微信小程序自带地图_微信小程序地图上选择位置
- Python学习笔记-基本语法
- 初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
- IntelliJ Idea学习笔记002---IDEA 全局搜索快捷键CTRL+SHIFT+F,不起作用
- Cygwin编译自己定义OpenCV库报错:opencv_contrib: LOCAL_SRC_FILES points to a missing file
- SLAM--非线性优化
- MTV和MVC的区别
- VS2012注册密钥
- 机器学习极好的入门学习视频推荐
- 计算机配置动态硬盘,【转】基本磁盘动态磁盘GTP磁盘MBR磁盘RAID阵列磁盘的区别(一)...
- NDK学习笔记-NDK开发流程
- vue学习篇——前后端分离开发
- linux系统时间编程(2) 各种时间标准GMT、UTC、世界时、TAI
- android type c 耳机检测,USB Type-C 的新音频标准将帮助 Android 设备去掉 3.5mm 耳机孔...