Java——生产者消费者中多线程安全问题
来源:互联网 发布:linux 服务器 反应慢 编辑:程序博客网 时间:2024/06/08 10:14
/*一个生产线程,一个消费线程,不存在安全问题当定义两个生产线程和消费线程的时候,出现了生产两次消费一次,生产一次消费两次的安全问题出现问题的原因是:线程被唤醒之后没有回去判断标记,直接执行后边的代码解决方式:让线程被唤醒之后不是直接执行后边的代码,而是回去判断标记 把if改成while但是这样又会出现新的问题:把if改为while之后,出现了死锁,原因是唤醒的是本方线程,导致所有线程全部等待,notify唤醒的是任意的线程,不能保证唤醒的是对方线程(生产对应消费)解决方式:把notify改为notifyAll但是这样又降低了效率,把不该唤醒的线程也唤醒了,进一步优化的解决方式会在以后的博客中介绍,在jdk1.5之前只能用这种方式解决这个方法...*///描述产品class Product{ private String name; private int count; private boolean flag; //生产产品的功能 public synchronized void produce(String name){ //if(flag){//把if改为while while(flag){ try{wait();}catch(InterruptedException e){e.printStackTrace();} } this.name = name+"..."+count; System.out.println(Thread.currentThread().getName()+"生产了..."+this.name); count++; flag = true; notifyAll(); } //生产的时候不能消费,消费的时候不能生产,否则会出现安全问题 //消费产品的功能 public synchronized void consume(){ while(!flag){ try{wait();}catch(InterruptedException e){e.printStackTrace();} } System.out.println(Thread.currentThread().getName()+"...消费了..."+this.name); flag = false; notifyAll(); }}//生产任务class Producer implements Runnable{ private Product pro; public Producer(Product pro){ this.pro = pro; } public void run(){ while(true){ pro.produce("笔记本"); } }}//消费任务class Consumer implements Runnable{ private Product pro; public Consumer(Product pro){ this.pro = pro; } public void run(){ while(true){ pro.consume(); } }}class test{ public static void main(String[] args){ Product pro = new Product(); Producer producer = new Producer(pro); Consumer consumer = new Consumer(pro); Thread t0 = new Thread(producer); Thread t1 = new Thread(producer); Thread t2 = new Thread(consumer); Thread t3 = new Thread(consumer); t0.start(); t1.start(); t2.start(); t3.start(); }}
阅读全文
2 0
- Java——生产者消费者中多线程安全问题
- java多线程——生产者、消费者
- java多线程应用——生产者消费者
- JAVA多线程实现生产者——消费者
- -java多线程——生产者和消费者
- Java多线程——生产者消费者模式
- Java——生产者消费者多线程实现
- java多线程—消费者生产者模式
- Java多线程—生产者-消费者问题
- 多线程——生产者消费者
- java多线程中生产者和消费者范例
- java多线程中,生产者消费者问题
- java多线程 消费者-生产者
- java多线程 消费者-生产者
- java 多线程 生产者消费者
- JAVA [ 多线程 -- 生产者消费者 ]
- Java 多线程-生产者、消费者
- java多线程--生产者消费者
- Calling python method from C++ (or C) callback
- Android 经典笔记七 全局弹窗Dialog
- Xilinx Vivado的使用详细介绍(3):使用IP核
- 51 nod 1107 斜率小于0的连线数量
- 域控问题汇总
- Java——生产者消费者中多线程安全问题
- BZOJ 1207 [HNOI2004]打鼹鼠 动态规划
- (DOM艺术) 一点Ajax知识
- Spring MVC框架搭建流程图
- 有关小程序的JAVA后台解密encryptedData获取openid及用户信息
- 最小生成树
- 冒泡排序
- 生成唯一订单号 BY uuid
- Spring Boot集成持久化Quartz定时任务管理和界面展示