スレッド読み書きファイル


マルチプロセス読み書きファイル:1つのプロセスAがファイルfileを書き、もう1つのプロセスBがファイルfile Doug Leaを読む彼の本には抽象クラスとしてサンプルコードReadWriteを提供し、同時の読み取り操作を許可し、同時の書き込み操作を許可せず、読み書き同時進行も許可しない.ReadWriteを拡張してSingleFileReadWriteのdoReadメソッドとdoWriteメソッドを実装し、ファイルスレッドAとスレッドBを読み書きするために同じSingleFileReadWriteインスタンスを使用することができます.
 
 
SingleFileReadWrite rw; threadB rw.read(); threadA rw.write();
Javaコード
 
abstract class ReadWrite {   
 protected int activeReaders = 0;  // threads executing read   
 protected int activeWriters = 0;  // always zero or one   
  
 protected int waitingReaders = 0; // threads not yet in read   
 protected int waitingWriters = 0; // same for write   
  
 protected abstract void doRead(); // implement in subclasses   
 protected abstract void doWrite();   
  
 public void read() throws InterruptedException {   
  beforeRead();   
  try   { doRead(); }   
  finally { afterRead(); }   
 }   
  
 public void write() throws InterruptedException {   
  beforeWrite();   
  try     { doWrite(); }   
  finally { afterWrite(); }   
 }   
 protected boolean allowReader() {   
  return waitingWriters == 0 && activeWriters == 0;   
 }   
  
 protected boolean allowWriter() {   
  return activeReaders == 0 && activeWriters == 0;   
 }   
  
 protected synchronized void beforeRead()   
  throws InterruptedException {   
   ++waitingReaders;   
   while (!allowReader()) {   
    try { wait(); }   
    catch (InterruptedException ie) {   
      --waitingReaders; // roll back state   
      throw ie;   
    }   
  }   
  --waitingReaders;   
  ++activeReaders;   
 }   
  
 protected synchronized void afterRead()  {   
  --activeReaders;   
  notifyAll();   
 }   
  
 protected synchronized void beforeWrite()   
  throws InterruptedException {   
   ++waitingWriters;   
   while (!allowWriter()) {   
    try { wait(); }   
    catch (InterruptedException ie) {   
     --waitingWriters;   
     throw ie;   
    }   
   }   
   --waitingWriters;   
   ++activeWriters;   
 }   
  
 protected synchronized void afterWrite() {   
  --activeWriters;   
  notifyAll();   
  }   
}