【JUC】生产者消费者问题(包含虚假唤醒问题)

本文详细介绍了生产者消费者问题的概念,将其比喻为肯德基的生产和消费过程,并通过Java代码展示了如何使用`synchronized`关键字和`wait/notifyAll`来解决此问题。然而,这种方式在多生产者或多消费者情况下可能出现虚假唤醒问题,通过引入`while`循环解决了这一问题。此外,还探讨了使用`Lock`接口中的`ReentrantLock`和`Condition`对象来更精确地控制线程同步,并介绍了如何实现精准唤醒。最后,提到了如何通过创建多个`Condition`实例来控制不同任务的顺序执行。

参考文章

【操作系统】生产者消费者问题_liushall-优快云博客_生产者消费者问题操作系统

概念

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。

 

可以理解为肯德基买炸鸡,

        生产者就相当于肯德基的后厨,生产炸鸡并放到前台

        消费者就相当于顾客,从前台获得炸鸡

        有限的缓冲区就相当于前台的保温柜里能放几只炸鸡

        但是生产炸鸡的时候顾客不能购买,购买炸鸡的时候后厨不能生产

注意事项:

        当缓冲区(前台)为空时,消费者(顾客)不能再进行消费

        当缓冲区(前台)为满时,生产者(后厨)不能再进行生产

        在线程进行生产或消费时,其余线程不能再进行生产或消费等操作,即保持线程的同步

通过传统synchronized锁来实现生产者消费者问题

实现生产者消费者问题的代码逻辑为

 也既,先判断满不满足条件,不满足让出CPU,直到再次被唤醒,满足则执行业务操作,执行完成后唤醒其他线程

public class Demo02pc {
    public static void main(String[] args) {
        Production production = new Production();
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                production.increase();
            }
        },"A").start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                production.decrease();
            }
        },"B").start();
    }
}

class Production{
    private int product=0;
    public synchronized void increase(){
        if (product!=0){        //不满足条件
            //等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //业务操作
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        product++;          //完成生产的业务操作
        System.out.println("生产者为:"+Thread.currentThread().getName());
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值