Java讀者寫者問題


實驗存檔。

允許好幾個人同時讀,但是不允許在有人讀的時候寫,以及同一時間只能有一個人在寫。

讀者.java:

package operating.entity.readerwriter;

import operating.method.Semaphore;

public class Reader implements Runnable {
    private static int total = 0;
    private int id;
    private Semaphore rmutex, wmutex;
    private static int readCount = 0;

    public Reader(Semaphore rmutex, Semaphore wmutex) {
        id = ++total;
        this.rmutex = rmutex;
        this.wmutex = wmutex;
    }

    @Override
    public void run() {
        while (true) {
            rmutex.p();
            // 只有第一個讀者進程需要執行 wmutex.p()
            if (readCount == 0) wmutex.p();
            readCount++;
            rmutex.v();

            // 執行讀操作
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            rmutex.p();
            readCount--;
            System.out.println(id + " 號讀者結束閱讀:當前還剩 " + readCount + " 位讀者在讀");
            if (readCount == 0) wmutex.v();
            rmutex.v();
        }
    }
}

寫者.java:

package operating.entity.readerwriter;

import operating.method.Semaphore;

public class Writer implements Runnable {
    private static int total = 0;
    private int id;
    private Semaphore wmutex;

    public Writer(Semaphore wmutex) {
        id = ++total;
        this.wmutex = wmutex;
    }

    @Override
    public void run() {
        while (true) {
            wmutex.p();
            // 執行寫操作
            System.out.println(id + " 號寫者正在寫");

            wmutex.v();
        }
    }
}

主函數.java:

package operating.test;

import operating.entity.readerwriter.Reader;
import operating.entity.readerwriter.Writer;
import operating.method.Semaphore;

public class ReaderWriterTest {
    public static void main(String[] args) {
        // 實現寫者與寫者間、讀者與寫者間互斥
        Semaphore wmutex = new Semaphore(1);
        // 用於改變 readCount 變量時實現互斥
        Semaphore rmutex = new Semaphore(1);

        for (int i = 0; i != 5; ++i) {
            new Thread(new Writer(wmutex)).start();
            new Thread(new Reader(rmutex, wmutex)).start();
        }
    }
}

/

Semaphore.java

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM