参考文章
【操作系统】生产者消费者问题_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());

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

被折叠的 条评论
为什么被折叠?



