多线程并发之生产者消费者问题与读者写者问题
引言
在程序界,有句流行语:我有一个问题,使用线程后,现在有了两个问题。多线程并发会出现很多问题,其中经典的有三个问题,生产者消费者问题、读者写者问题和哲学家就餐问题。
背景
并发使用多线程,会得到效率的提升。由于这些线程的执行顺序未知,这会由于线程间的执行顺序导致很多问题。这些问题最后都可以归纳为两类问题——生产者消费者问题与读者写者问题。
在这里,将尝试解决这类问题。
解决方案
不论生产者消费者问题,还是读者写者问题,最终都可以简单的归纳为一下模型。
获取权限
执行
释放权限
下面将给出获取权限和释放权限的代码
生产者消费者问题代码
public class ProducerConsumerLockUtils {
public static int num = 0;
private static int MAX = 6;
private static Lock producerConsumerLock = new ReentrantLock();
public synchronized void acquireProducerLock(){
while (num >= MAX) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
producerConsumerLock.lock();
}
public synchronized void releaseProducerLock(){
num++;
this.notify();
producerConsumerLock.unlock();
}
public synchronized void acquireConsumerLock(){
while (num < 1) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
producerConsumerLock.lock();
}
public synchronized void releaseConsumerLock(){
num--;
this.notify();
producerConsumerLock.unlock();
}
}
读者写者问题代码
public class ReaderWriterLockUtils {
private int readerNum = 0;
private static Lock readerWriterLock = new ReentrantLock();
public synchronized void acquireReaderLock() {
while (readerNum == 0) {
readerWriterLock.lock();
}
readerNum++;
}
public synchronized void releaseReaderLock() {
readerNum--;
while (readerNum == 0) {
readerWriterLock.unlock();
}
this.notify();
}
public synchronized void acquireWriterLock() {
while (readerNum > 0) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
readerWriterLock.lock();
}
public synchronized void releaseWriterLock() {
this.notifyAll();
readerWriterLock.unlock();
}
}