多线程并发之生产者消费者问题与读者写者问题

多线程并发之生产者消费者问题与读者写者问题

引言

在程序界,有句流行语:我有一个问题,使用线程后,现在有了两个问题。多线程并发会出现很多问题,其中经典的有三个问题,生产者消费者问题、读者写者问题和哲学家就餐问题。

背景

并发使用多线程,会得到效率的提升。由于这些线程的执行顺序未知,这会由于线程间的执行顺序导致很多问题。这些问题最后都可以归纳为两类问题——生产者消费者问题与读者写者问题。
在这里,将尝试解决这类问题。

解决方案

不论生产者消费者问题,还是读者写者问题,最终都可以简单的归纳为一下模型。

获取权限
执行
释放权限

下面将给出获取权限和释放权限的代码

生产者消费者问题代码

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();
    }
}
由于这是初步的code,其中会有不完备指出,望指出,谢谢!

你可能感兴趣的:(多线程并发之生产者消费者问题与读者写者问题)