多線程并發(fā)之生產(chǎn)者消費者問題與讀者寫者問題

多線程并發(fā)之生產(chǎn)者消費者問題與讀者寫者問題

引言

在程序界,有句流行語:我有一個問題,使用線程后,現(xiàn)在有了兩個問題。多線程并發(fā)會出現(xiàn)很多問題,其中經(jīng)典的有三個問題,生產(chǎn)者消費者問題、讀者寫者問題和哲學家就餐問題。

背景

并發(fā)使用多線程,會得到效率的提升。由于這些線程的執(zhí)行順序未知,這會由于線程間的執(zhí)行順序?qū)е潞芏鄦栴}。這些問題最后都可以歸納為兩類問題——生產(chǎn)者消費者問題與讀者寫者問題。
在這里,將嘗試解決這類問題。

解決方案

不論生產(chǎn)者消費者問題,還是讀者寫者問題,最終都可以簡單的歸納為一下模型。

獲取權(quán)限
執(zhí)行
釋放權(quán)限

下面將給出獲取權(quán)限和釋放權(quán)限的代碼

生產(chǎn)者消費者問題代碼

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,其中會有不完備指出,望指出,謝謝!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容