博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java-生产者消费者线程的虚假唤醒
阅读量:7188 次
发布时间:2019-06-29

本文共 2043 字,大约阅读时间需要 6 分钟。

hot3.png

虚假唤醒  

当同时有多个生产者消费者线程时notifyAll唤醒后多个wait继续执行 可能会导致数据的不安全 

主要是由于唤醒后线程重新取得锁后 会继续执行wait后面的操作 之前的代码不会执行 这个时候其他线程已经修改了判断条件
jdk推荐的解决办法为通过  while循环判断造成wait的等待条件

public class ProductAndConsumer {    public static void main(String[] args) {        Pen pen = new Pen();        Consumer cus = new Consumer(pen);        Product pro = new Product(pen);        new Thread(pro,"pro1").start();        new Thread(pro,"pro2").start();        new Thread(cus,"cus1").start();        new Thread(cus,"cus2").start();    }}class Pen{    private int count = 10;    public synchronized void getCount() {        while(count < 10) {            System.out.println(Thread.currentThread().getName()+":"+ "缺货");            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }                System.out.println(Thread.currentThread().getName()+":"+ --count);        this.notifyAll();    }    public synchronized void setCount() {        while(count >= 10) {            System.out.println(Thread.currentThread().getName()+":"+ "仓库满了");            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }                System.out.println(Thread.currentThread().getName()+":"+ ++count);        this.notifyAll();    }}class Product implements Runnable{    private Pen pen = null;        public Product(Pen pen) {        this.pen = pen;    }        @Override    public void run() {        for(int i=0;i<2000;i++) {            pen.setCount();        }    }}class Consumer implements Runnable{    private Pen pen = null;        public Consumer(Pen pen) {        this.pen = pen;    }        @Override    public void run() {        try {            Thread.sleep(40);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        for(int i=0;i<2000;i++) {            pen.getCount();        }    }}

 

转载于:https://my.oschina.net/dajianguo/blog/1499041

你可能感兴趣的文章
上下文切换查看 & sar
查看>>
queue-reconstruction-by-height
查看>>
android 得到连接热点的ip的方法
查看>>
Redis 安装 与 使用
查看>>
分块算法(简洁易懂)
查看>>
P3372 【模板】线段树 1
查看>>
怎样才是一个基本水平的java程序员?
查看>>
磁盘阵列
查看>>
20145328 《Java程序设计》实验四实验报告
查看>>
Largest Point
查看>>
构建高可靠hadoop集群之4-权限指引
查看>>
用 Flask 来写个轻博客 (21) — 结合 reCAPTCHA 验证码实现用户注册与登录
查看>>
数据库
查看>>
React:redux+router4搭建应用骨架
查看>>
13.文档模板架构
查看>>
动态规划之硬币组合问题
查看>>
冲刺二阶段———个人总结02
查看>>
css第四课时
查看>>
BUAA_OO_第三单元
查看>>
通讯录的输入输出
查看>>