實驗存檔。
允許好幾個人同時讀,但是不允許在有人讀的時候寫,以及同一時間只能有一個人在寫。
讀者.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(); } } }
/