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

  1. 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger...

    1.Semaphore  信号量 Semaphore(信号量)是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得semaphore.如果semaphore的内部计数 ...

  2. Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore

    在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信).Semaphore(控制方法被线程访问的数量),他们 ...

  3. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

  4. 并发编程系列之Semaphore

    前言 上节我们介绍了Java中的并发工具类CountDownLatch和Cyclicbarrier,今天我们再来说说另外两个并发工具类:Semaphore(信号量)和Exchanger(交换者),首先 ...

  5. 并发工具类(三)控制并发线程数的Semaphore

    http://ifeve.com/concurrency-semaphore/ 简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很 ...

  6. JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore

    作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...

  7. (面经总结)一篇文章带你完整复习 Java 中并发关键字(CountDownLatch/CyclicBarrier/Semaphore/Volatile)

    文章目录 一.倒计数器:CountDownLatch 二.循环栅栏:CyclicBarrier 三.信号量:Semaphore 四.volatile 关键字的作用 一.倒计数器:CountDownLa ...

  8. java并发编程同步器 Semaphore、CyclicBarrier、Exchanger、CountDownLatch

    为什么80%的码农都做不了架构师?>>>    一.Semaphore(信号量) 注解:信号量,其实就是定义一定的数量,只有释放一个才能进去下一个,其余都得进入等待状态.比如有2个洗 ...

  9. Java并发工具类:CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser

    本文目录: 1.CountDownLatch(闭锁) 1.CountDownLatch 例子 2.CyclicBarrier(循环栅栏) 1.CyclicBarrier 例子 2.CountDownL ...

最新文章

  1. 程序员吐槽:在阿里工作带来光环,在京东却带来负面影响!
  2. 边缘计算 — 与 5G
  3. final关键字的几大特征
  4. android主板接口定义,范例解析:学习Android的IPC主板模式
  5. 让未备案的网站先飙起来
  6. WebForm 分页与组合查询
  7. 微信小程序自带地图_微信小程序地图上选择位置
  8. Python学习笔记-基本语法
  9. 初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
  10. IntelliJ Idea学习笔记002---IDEA 全局搜索快捷键CTRL+SHIFT+F,不起作用
  11. Cygwin编译自己定义OpenCV库报错:opencv_contrib: LOCAL_SRC_FILES points to a missing file
  12. SLAM--非线性优化
  13. MTV和MVC的区别
  14. VS2012注册密钥
  15. 机器学习极好的入门学习视频推荐
  16. 计算机配置动态硬盘,【转】基本磁盘动态磁盘GTP磁盘MBR磁盘RAID阵列磁盘的区别(一)...
  17. NDK学习笔记-NDK开发流程
  18. vue学习篇——前后端分离开发
  19. linux系统时间编程(2) 各种时间标准GMT、UTC、世界时、TAI
  20. android type c 耳机检测,USB Type-C 的新音频标准将帮助 Android 设备去掉 3.5mm 耳机孔...

热门文章

  1. XML文件中的CDATA的使用.
  2. shell脚本把昨天的txt打成tar包
  3. 在线聊天javascript代码
  4. Spring 2.X 中AOP的简明教程
  5. 21/100. Two Sum
  6. python3学习笔记10(迭代器和生成器)
  7. BZOJ1795 : [Ioi2008]Pyramid Base 金字塔地基
  8. ECMAScript 6的一些新特性
  9. Centos 7安装gvim
  10. windows程序快速启动的方式:WIN键+R