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();
    }
}