进程同步-生产者和消费者(PV操作实现——java多线程模拟)
目录
生产者和消费者概述
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。——[百度百科]
PV操作解决生产者和消费者
semaphore empty = 6; //缓冲区初始空位置数为6
semaphore full = 0; //缓冲区初始满位置数为0
semaphore mutex = 1; //缓冲区互斥
生产者
P(empty);
P(mutex);
生产者生产食物;
V(mutex);
V(full);
消费者
P(full);
P(mutex);
消费者消费食物;
V(mutex);
V(empty);
任务要求
首先要写出PV操作的java代码,因为是原子操作,所以要加锁(synchronized)
代码如下
//信号量减一,若信号量小于0,本线程阻塞。
synchronized void P(Semaphore S)
{
S.value--;
if(S.value < 0){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//信号量加一,若信号量依旧<=0,便将阻塞队列里一线程唤醒
synchronized void V(Semaphore S)
{
S.value++;