multi thread 6

Read Write Lock パターン

ReadThreadとWriteThreadが動いており,その衝突を防ぐ為には

  • read-write conflict(「読む」と「書く」の衝突)
  • write-write conflict(「書く」と「書く」の衝突)

を避けなくてはならない.(「読む」同士は衝突しない)

そのためには「読んでいる」スレッドが取るロックReadLockと「書いている」スレッドが取るロックWriteLockを用意する.また,それぞれのロックを解除するReadUnLockとWriteUnLockを用意する.

ReadWriteLock class

public synchronized void readLock() throws InterruptedException {
    while ( the writing thread exists ) {
        wait();
    }
    (The reading thread has begun)
}
public synchronized voida readUnLock() {
    notifyAll();
}
public synchronized void writeLock() throws InterruptedException {
    try {
        while ( the writing thread or the reading thread exists ) {
            wait();
        }
    }
    (The writing thread has begun)
}
public synchronized void writeUnLock() throws InterruptedException {
    notifyAll();
}

ReadAndWrite class

private final ReadWriteLock lock = new ReadWriteLock();
public void read() throws InterruptedException {
    lock.readLock();
    try {
        return doRead();
    } finally {
        lock.readUnLock();
    }
}
public void write() throws InterruptedException {
    lock.writeLock();
    try {
        return doWrite();
    } finally {
        lock.writeUnLock();
    }
}

ちなみにtry… finally 文の中で return があるが,returnで戻る前にfinallyの内容が実行されるのでロックは解放される.

これも実際には,java.util.concurrent.locks.ReadWriteLock を使うだろう.

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中