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

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言語で学ぶデザインパターン入門 マルチスレッド編 第4章 Balking

Balkingは「ボーキング」で、「やめて帰る」こと。野球のボークね。Guarded Suspensionは条件が満たされるまで待つんだけど、Balkingは条件が満たされなかったすぐ終了する。

public class GuardedObject {
    public synchronized void guardedMethod() {
        if (![ガード条件]) {
            return;
        }

        [目的の処理]
    }

    public synchronized void stateChangingMethod() {
        [状態を変化させる]
    }
}

これはwait(), notifyAll()は使わないのね。

Java言語で学ぶデザインパターン入門 マルチスレッド編 第3章 Guarded Suspension

ある条件が満たされないと実行できない処理があって、別のスレッドがその条件を変化させることによって実行を制御するパターン。「条件付きのsynchronized」「マルチスレッド版のif」だそうです。

public class GuardedObject {
    public synchronized void guardedMethod() {
        while (![ガード条件]) {
            wait();
        }

        [目的の処理]
    }

    public synchronized void stateChangingMethod() {
        [状態を変化させる]
        notifyAll();
    }
}

Java言語で学ぶデザインパターン入門 マルチスレッド編 第2章 Immutable

マルチスレッドで困るのはインスタンスの状態を変化させる時に矛盾が生じてしまうことなので、状態を変化させることができないならばマルチスレッドでも何ら問題ない。とゆーわけで、コンストラクタで生成した後は状態を一切変化できないようにするのがImmutable。setterメソッドを定義しない。

public final class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Java言語で学ぶデザインパターン入門 マルチスレッド編 第1章 Single Threaded Execution

AWDwRを読み終わって日記を書くモチベーションが下がっちゃったんで、新しい本を読んで行こうかな。で、今の案件でマルチスレッドを扱うので「Java言語で学ぶデザインパターン入門 マルチスレッド編 」を読むことにしましたよ。(って、今からかよっ!)



というわけでまずは第1章「Single Threaded Execution」

複数のスレッドから同時に実行されるとまずいメソッドは同時に一つのスレッドからしか実行されないようにガードしましょう。具体的にはsynchronizedメソッドにする。

public synchronized void unsafeMethod() {
    ...
}

ま、これは普通のsynchronizedメソッドの話だね。

「Agile Web Development with Rails 勉強記」まとめ