生产者/消费者 - synchronized
时间:2022-05-14
本文章向大家介绍生产者/消费者 - synchronized,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天用synchronized实现了下生产者/消费者模式,遇到几个小问题,记录下。
public class SynchronizedDemo { //类似包子铺场景:包子最多提前做好50个,卖出去5个就再做;卖完了,买包子的就得等着 //Synchronized版本 private static int MAX = 50; private int number = 0; public void produce() throws InterruptedException { while (true) { synchronized (this) { if (number == MAX) { //释放锁,出让cpu时间片,线程状态 - WAITING,等待唤醒 this.wait(); continue; } number++; System.out.println("+++++第 " + number + " 个包子被做出来了! - " + Thread.currentThread().getName()); if (number > 20) { //做出包子超过20个,买包子的赶紧买 this.notifyAll(); } } } } public void consume() throws InterruptedException { while (true) { synchronized (this) { if (number == 0) { //释放锁,出让cpu时间片,线程状态 - WAITING,等待唤醒 this.wait(); continue; } System.out.println("-----第 " + number + "个包子被买了! - " + Thread.currentThread().getName()); number--; if (number < MAX - 5) { //包子空缺超过5个,通知做包子的赶紧做 this.notifyAll(); } } } } public static void main(String[] args) { SynchronizedDemo synchronizedDemo = new SynchronizedDemo(); //5个做包子的 for (int i = 0; i < 5; i++) { new Thread(() -> { try { synchronizedDemo.produce(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } //20个买包子的 for (int i = 0; i < 20; i++) { new Thread(() -> { try { synchronizedDemo.consume(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } } }
produce()和consume()方法中在调用 this.wait() 后,之前手快写了个return。。。
排查了半天,重走了下逻辑才发现。
排查过程中,理解了下 return 和不启用 notifyAll() 的线程统计。
1. return + 启用notifyAll()
此时对应线程就结束了,会看到有几个线程(4-5个)处于WAITING状态。
2. continue + 不启用 notifyAll()
所有线程最终都会进入WAITING状态。
原文地址:https://www.cnblogs.com/hello-yz/p/16269644.html
- Github 年度开源报告:TensorFlow 成最受欢迎深度学习项目
- [持续更新]批处理重命名系列案例
- java学习之协调同步的线程
- 如何确保NFS服务安全
- ASM 翻译系列第三十八弹:ASM数据清理
- 借助PageSpeed,为Nginx网站服务器提速
- DX-watermark插件无法预览及上传图片报imagesx()错误的解决办法
- 抓取占用CPU高的JAVA线程,进而找出有问题的WEB页面
- ASM 翻译系列第三十九弹:物理元数据AT表
- ASM 翻译系列第四十弹:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含义
- 给XFN链接关系加上“nofollow”选项
- LVS中采用Jboss作为RealServer的配置要点
- 基于Prometheus的数据库监控
- Uva-------(11462) Age Sort(计数排序)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法