生产者消费者问题
生产者消费者问题是操作系统中经典的多线程操作问题,这里主要讲解如何在java中解决生产者消费者问题,避免死锁的产生。
生产者消费者问题简单来说就是有生产者和消费者两类人,生产者负责生产产品,消费者负责消费产品,怎么保证消费者进行消费的时候一定有产品可以进行消费?如果产品都存储在仓库里,怎么保证生产者生产不会超出仓库的存储限制?这就是生产者消费者问题的核心。
解决方法
一、使用传统的synchronized锁解决该问题
使用传统的synchronized锁解决该问题在操作方法加上synchronized关键字即可,将消费者从仓库拿产品和生产者在往仓库中存放产品的操作加上锁,在消费者和生产者进行操作时,其他人不能对仓库进行操作。
package demo_01;
public class product_consumer {
public static void main(String[] args) {
PV pv = new PV();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
pv.producer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
pv.consumer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"消费者").start();
}
}
class PV{
private int number = 0;
public synchronized void consumer() throws InterruptedException {
if(number == 0){
this.wait(); // 等待
}
number -- ;
System.out.println(Thread.currentThread().getName()+" => "+ number);
this.notifyAll(); // 通知其他线程,完成了消费
}
public synchronized void