Java言語で学ぶデザインパターン入門 マルチスレッド編 第5章 Producer-Consumer
一方でどんどんデータを生成し登録していき、他方でどんどんデータを取り出して利用するパターン。イベントディスパッチャなんかでよく使うね。
public class Channel { private List queue = new LinkedList(); public synchronized void put(Data data) { while (MAX_SIZE <= queue.size()) { wait(); } queue.addLast(data); notifyAll(); } public synchronized Data take() { while (queue.size() <= 0) { wait(); } Data data = queue.removeFirst(); notifyAll(); return data; } }
Java言語で学ぶデザインパターン入門 マルチスレッド編 第6章 Read-Write Lock
読むのは同時にできるけど誰かが読んでいるときは書き込めない。誰かが書き込んでいる間は読むのも書くのもできない。読む処理どうしは排他されないのでパフォーマンスが上がる。
public class ReadWriteLock { public synchronized void readLock() { while (0 < writers) { wait(); } readers++; } public synchronized void readUnlock() { readers--; notifyAll(); } public synchronized void writeLock() { while (0 < writers || 0 < readers) { wait(); } writers++; } public synchronized void writeUnlock() { writers--; notifyAll(); } }