栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程:生产者消费者问题,虚假唤醒

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程:生产者消费者问题,虚假唤醒

生产者与消费者问题是面试的常考题,并且经常让手撕代码

生产者消费者本质其实就是两个对象同时操作同一个变量,此时如果是多线程,就必须要加锁,防止线程之间的相互影响,以下是代码:

创建一个 ticket 对象,有添加和减少的方法,对应着生产和消费,然后 new 两个线程去分别调用两个方法,为了防止线程冲突,方法 使用 synchornized 修饰。

public class MyThread {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                try {
                    ticket.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                try {
                    ticket.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "B").start();
    }
}
class Ticket {
    private int number = 0;
    public synchronized void increment() throws InterruptedException {
        if (number != 0) {
            this.wait();//生产者,如果不是 0,等待
        }//如果是零,开始生产,同时通知其他所有线程
        number++;
        System.out.println(Thread.currentThread().getName() + " " + number);
        this.notifyAll();
    }
    public synchronized void decrement() throws InterruptedException {
        if (number == 0) {
            this.wait();//消费者同理
        }
        number--;
        System.out.println(Thread.currentThread().getName() + " " + number);
        this.notifyAll();
    }
}

运行代码看结果:

齐刷刷的 1-0 交替,仿佛是完成了代码,但是面试官看到这样的代码一定直摇头,他会说,如果你再创建几个线程呢?
那就再开俩线程测试一下呗:

运行代码发现:

这是什么东西,怎么回事?
打开 API 文档,找到 Object 类的 wait 方法

线程可以背唤醒,而不会接通知,中断或者超时,即所谓的 虚假唤醒,原因是我们使用 if 来判断条件,但是等待应该总是出现在循环中,所以,修改代码


把 if 修改为 while,再次运行的结果:

没有任何问题,1,0 交替出现,完成生产者消费者问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/341133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号