高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll
文章目录
- 概述
- 解决办法
概述
高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这个问题呢?
解决办法
- 多线程情况用while而不是if 来判断条件是否满足
- notify —> notifyAll
package com.artisan.test;import java.util.stream.Stream;public class MultiProduceConsumerDemo2 {// 对象监视器-锁private final Object LOCK = new Object();// 是否生产出数据的标识private boolean isProduced = false;// volatile 确保可见性, 假设 i 就是生产者生产的数据private volatile int i = 0;public void produce() {synchronized (LOCK) {String msg = isProduced ? "已生产货物" : "没有货物可搬运";// while 每次被唤醒时都会先检查isProduced是否滿足條件再继续// 不能用if的原因:if它将不再判断isProduced是否滿足條件,直接继续,引发错误// 举个例子 t1 ,t2 都进入到了wait ,然后使用if, 唤醒了t2后,不再判断isProduced是否滿足條件// 直接又生产了一个,导致生产多了数据while (isProduced) {try {System.out.println(Thread.currentThread().getName() + " GOT LOCK ,isProduced= " + isProduced + " wait becauseof " + msg);LOCK.wait();} catch (InterruptedException e) {e.printStackTrace();}}i++;System.out.println(Thread.currentThread().getName() + " GOT LOCK ,isProduced= " + isProduced + " Produce:" + i);// 唤醒所有正在等待这个对象的monitor的线程LOCK.notifyAll();isProduced = true;}}public void consume() {// 加锁synchronized (LOCK) {String msg = isProduced ? "已生产货物" : "没有货物可搬运";// while 每次被唤醒时都会先检查isProduced是否滿足條件再继续while (!isProduced) {try {System.out.println(Thread.currentThread().getName() + " wait becauseof " + msg);LOCK.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + " GOT LOCK ,isProduced= " + isProduced + " Consume:" + i);//唤醒所有正在等待这个对象的monitor的线程LOCK.notifyAll();isProduced = false;}}public static void main(String[] args) {MultiProduceConsumerDemo2 produceConsumerDemo = new MultiProduceConsumerDemo2();Stream.of("P1", "P2").forEach(n -> new Thread(n) {@Overridepublic void run() {while (true) produceConsumerDemo.produce();}}.start());Stream.of("C1", "C2").forEach(n -> new Thread(n) {@Overridepublic void run() {while (true) produceConsumerDemo.consume();}}.start());}
}
高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll相关推荐
- 高并发编程-自定义简易的线程池(2),体会原理
文章目录 概述 示例 概述 高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来 拒绝策略 关闭线程池 最小 最大 活动线程数 - 示例 比较简单,直接上 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解
前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...
- Java高并发编程详解系列-Future设计模式
导语 假设,在一个使用场景中有一个任务需要执行比较长的时间,通常需要等待任务执行结束之后或者是中途出错之后才能返回结果.在这个期间调用者只能等待,对于这个结果Future设计模式提供了一种凭据式的 ...
- Java高并发编程详解系列-Java线程入门
根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面. 首先介绍一下这个系列的东西是什么,这个系列自己 ...
- Java高并发编程 (马士兵老师视频)笔记(一)同步器
本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...
- java线程高并发编程
java线程详解及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了,看看百度百科对他的评价,一点也不为过: 如果IT的历史,是 ...
- 高并发编程学习(2)——线程通信详解
前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...
- JUC高并发编程从入门到精通(全)
目录 前言 1. Lock接口 1.1 复习synchronized 1.2 Lock接口 1.3 Lock方法 1.4 两者差异 2. 线程间通信 2.1 synchronized案例 2.2 Lo ...
最新文章
- kafka笔记3(生产者)
- python——字符串常用方法
- android adb 传文件大小,使用adb在电脑和手机间传文件
- 体验C++20新特性的最简便方法
- HDOJ 5087 Revenge of LIS II DP
- Linux下安装PHP扩展
- EPC901安装XP
- 【工具类】数据脱敏工具类
- 化工行业ERP管理系统丨外贸软件
- 【老文档】手机夜间场景省电技术
- java 实心圆_java JFrame窗口中画一个实心圆并设置背景颜色,但背景不显示,级求解!!...
- Microsoft Web Farm Framework (WFF) 2.0正式发布
- 魔法师元素平衡(C++解法)
- 面稀土,战码家(二)
- 学习R语言编程——常用算法——导数与微积分的近似计算
- 形参的种类及其能否改变实参
- Mysql配置文件/etc/my.cnf解析
- 数据库的数据存储文件
- SpringBoot高级特性
- 读《追风筝的人》有感