public class ListAdd2 {private volatile static List list = new ArrayList();    public void add(){list.add("bjsxt");}public int size(){return list.size();}public static void main(String[] args) {final ListAdd2 list2 = new ListAdd2();// 1 实例化出来一个 lock// 当使用wait 和 notify 的时候 , 一定要配合着synchronized关键字去使用final Object lock = new Object();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {synchronized (lock) {for(int i = 0; i <10; i++){list2.add();System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");Thread.sleep(500);if(list2.size() == 5){System.out.println("已经发出通知..");lock.notify();}}                       }} catch (InterruptedException e) {e.printStackTrace();}}}, "t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (lock) {if(list2.size() != 5){try {System.out.println("t2进入...");lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");}}}, "t2");   t2.start();t1.start();}}

输出结果

t2进入...
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..

可以看出来wait方法会让出锁的使用权,而notify不会让出来
现在引入了CountDownLatch方法

CountDownLatch是通过“共享锁”实现的。在创建CountDownLatch中时,会传递一个int类型参数count,该参数是“锁计数器”的初始状态,表示该“共享锁”最多能被count线程同时获取。当某线程调用该CountDownLatch对象的await()方法时,该线程会等待“共享锁”可用时,才能获取“共享锁”进而继续运行。而“共享锁”可用的条件,就是“锁计数器”的值为0!而“锁计数器”的初始值为count,每当一个线程调用该CountDownLatch对象的countDown()方法时,才将“锁计数器”-1;通过这种方式,必须有count个线程调用countDown()之后,“锁计数器”才为0,而前面提到的等待线程才能继续运行!

CountDownLatch的两个主要方法

// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
void await()

// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
void countDown()

package heihei;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/*** wait notfiy 方法,wait释放锁,notfiy不释放锁* @author alienware**/
public class ListAdd2 {private volatile static List list = new ArrayList();    public void add(){list.add("bjsxt");}public int size(){return list.size();}public static void main(String[] args) {final ListAdd2 list2 = new ListAdd2();final CountDownLatch countDownLatch = new CountDownLatch(1);Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {for(int i = 0; i <10; i++){list2.add();System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");Thread.sleep(500);if(list2.size() == 5){System.out.println("已经发出通知..");countDownLatch.countDown();}}                       } catch (InterruptedException e) {e.printStackTrace();}}}, "t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {//synchronized (lock) {if(list2.size() != 5){try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");throw new RuntimeException();}}, "t2");   t2.start();t1.start();}}

这样做的话输出结果是

当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..

顺序正确

notify和wait相关推荐

  1. 用实例揭示notify()和notifyAll()的本质区别

    用实例揭示notify()和notifyAll()的本质区别 收藏 notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notifyA ...

  2. java notify 的作用_java 为什么notify和notifyAll都不起作用?

    叮当猫咪 每个线程初始化的时候都是 c=new C(),锁住的是不同的对象.class Example{    public static void main(String arr[]){      ...

  3. lua java 性能比较_Lua coroutine vs Java wait/notify

    在上文Lua coroutine 不一样的多线程编程思路中想到coroutine的运行机制跟Java中的wait/notify很相似,所以写了一个简单程序比较一下. 源代码 Lua code co = ...

  4. java wait abc_java----wait/notify

    解释 wait/notify必须配合synchronized使用 demo class NotifyStop2 { private final Object lock = new Object(); ...

  5. JAVA多线程之Synchronized、wait、notify实例讲解

    一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...

  6. java 线程交互_java 线程交互之wait/notify

    众所周知java支持多线程,有多线程就必然会存在多线程的交互,交互方式有多种,比如通过共享数据,或者通过提供的锁信号量等等,这里通过用wait以及notify实现线程交互. 要用好线程的wait和no ...

  7. 解决THINKPHP 支付宝接口异步notify 无效可能的问题。

    2019独角兽企业重金招聘Python工程师标准>>> 支付成功后,发现alipayReturn 正常~ AlipayNotify 怎么搞都不正常,好像支付宝就是不能POST过来. ...

  8. java线程wait_java多线程学习(四) 之 wait和notify

    ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...

  9. java线程-保护性暂停(wait,notify实现)

    考虑以下场景需求: A同学计算一个结果res B同学需要等待A同学的结果res 需要用到保护性暂停:一个线程等待另外一个线程的执行结果 这里我们让A,B同学关联到一个类. B同学一直等待A同学 imp ...

  10. Java中的等待/通知机制(wait/notify)

    为什么80%的码农都做不了架构师?>>>    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...

最新文章

  1. 理解 IntelliJ IDEA 的项目配置和Web部署
  2. 纪念乔帮主-Jobes的生平视频
  3. verdi使用linux命令,verdi工具的使用
  4. golang中的strings.HasPrefix
  5. activepython win32com_activepython下载
  6. android进程间通信:使用AIDL
  7. 【计算机图形学】实验:C#语言采用GDI+定义笔刷并填充图形完整实验操作流程
  8. 58到家为2000万家庭提供上门生活服务的背后是云计算的高效支撑
  9. 电话号码正则表达式 (包含电话号码 和 手机号码)
  10. jQuery.access的作用
  11. (转)以太坊(Ethereum ETH)是如何计算难度的
  12. Node.js简介与架构
  13. 基于jQuery的响应式网站视频插件FitVids.js
  14. 2021-09-11
  15. 奥卡姆剃刀定律(Occam‘s Razor)
  16. 微信硬件开发系列教程04-新浪云服务器搭建(airkiss/airsync)
  17. Storage of multidimensional arrays based on arbitrary tiling
  18. OpenCV每日函数 几何图像变换模块 (9) resize函数
  19. 【python】matplotlib.pyplot介绍
  20. Springboot+vue+java幼儿园管理系统

热门文章

  1. 详解Windows内存分页机制
  2. MySQL中B-tree索引和Hash索引区别
  3. 今天才知道,MySQL 的 binlog 编号可以这么大!
  4. 深度阅读之《Concurrency in Go》
  5. @你最强资源包来了 MobTech 联合 LiveVideoStack 发起劳动光荣榜
  6. LiveVideoStack线上交流分享 (十) —— 开源声码器WORLD在语音合成中的应用
  7. LiveVideoStack线上交流分享 ( 三 ) —— 实时视频通信质量评价及寻找视频质量甜点的方法...
  8. 腾讯研发效率领先的秘密:高效率的工具
  9. linux下mysql安装
  10. 联邦学习:保护用户数据隐私