スレッド読み書きファイル
マルチプロセス読み書きファイル: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コード
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();
}
}