文章目录

  • 概述
  • 解决办法

概述

高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这个问题呢?


解决办法

  1. 多线程情况用while而不是if 来判断条件是否满足
  2. 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相关推荐

  1. 高并发编程-自定义简易的线程池(2),体会原理

    文章目录 概述 示例 概述 高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来 拒绝策略 关闭线程池 最小 最大 活动线程数 - 示例 比较简单,直接上 ...

  2. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  4. Java高并发编程详解系列-Future设计模式

    导语   假设,在一个使用场景中有一个任务需要执行比较长的时间,通常需要等待任务执行结束之后或者是中途出错之后才能返回结果.在这个期间调用者只能等待,对于这个结果Future设计模式提供了一种凭据式的 ...

  5. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  6. Java高并发编程 (马士兵老师视频)笔记(一)同步器

    本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...

  7. java线程高并发编程

    java线程详解及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了,看看百度百科对他的评价,一点也不为过: 如果IT的历史,是 ...

  8. 高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  9. JUC高并发编程从入门到精通(全)

    目录 前言 1. Lock接口 1.1 复习synchronized 1.2 Lock接口 1.3 Lock方法 1.4 两者差异 2. 线程间通信 2.1 synchronized案例 2.2 Lo ...

最新文章

  1. kafka笔记3(生产者)
  2. python——字符串常用方法
  3. android adb 传文件大小,使用adb在电脑和手机间传文件
  4. 体验C++20新特性的最简便方法
  5. HDOJ 5087 Revenge of LIS II DP
  6. Linux下安装PHP扩展
  7. EPC901安装XP
  8. 【工具类】数据脱敏工具类
  9. 化工行业ERP管理系统丨外贸软件
  10. 【老文档】手机夜间场景省电技术
  11. java 实心圆_java JFrame窗口中画一个实心圆并设置背景颜色,但背景不显示,级求解!!...
  12. Microsoft Web Farm Framework (WFF) 2.0正式发布
  13. 魔法师元素平衡(C++解法)
  14. 面稀土,战码家(二)
  15. 学习R语言编程——常用算法——导数与微积分的近似计算
  16. 形参的种类及其能否改变实参
  17. Mysql配置文件/etc/my.cnf解析
  18. 数据库的数据存储文件
  19. SpringBoot高级特性
  20. 读《追风筝的人》有感

热门文章

  1. android 之四大组件的Activity详解
  2. 解决Ubuntu spyder 无法输入中文
  3. opencv 通过颜色提取显示屏数字
  4. Leetcode 112. 路径总和 (每日一题 20210910)
  5. R语言应用实战系列(二)-基于R语言的方差分析
  6. 前端白屏问题_前端优化-如何计算白屏和首屏时间
  7. Python入门100题 | 第054题
  8. GIS中的拓扑关系和ArcGIS中的拓扑
  9. 【机器学习PAI实践六】金融贷款发放预测
  10. 【LeetCode从零单排】No15 3Sum