ReentrantLockクラス
明示的にロックを獲得する – ReentrantLockクラス- public void lock()
- public void unlock()
- regex:正規表現
- flags:検索オプション
- input:入力文字列
synchronizedブロックによる同期は、アプリ開発者がロックの獲得/解除を意識しなくても良いことから「暗黙的なロック」と呼ばれます。対して、メソッドを跨る処理などで「明示的に」ロックを獲得/解除したい場合があります。この場合、ReentrantLockクラス(java.util.concurrent.locksパッケージ)を利用します。
ReentrantLockクラスではlockメソッドで明示的にロックを獲得した後、unlockメソッドで解除する必要があります。
以下は、synchronized修飾子の項のサンプル(incrementメソッド)をReentrantLockクラスで書き換えたものです。
LockSample.java
package com.example.mynavi.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockSample {
private int count;
private final Lock lock = new ReentrantLock();
public static void main(String[] args) {
LockSample ls = new LockSample();
ls.execute();
}
public void execute() {
final int THREAD_MAX = 300000;
Thread[] ts = new Thread[THREAD_MAX];
for (int i = 0; i < THREAD_MAX; i++) {
ts[i] = new Thread(new MyThread(this));
ts[i].start();
}
for (int i = 0; i < THREAD_MAX; i++) {
try {
ts[i].join();
} catch (InterruptedException e) {
System.out.println(e);
}
}
System.out.println(count);
}
public void increment() {
lock.lock();
try {
this.count++;
} finally {
lock.unlock();
}
}
private static class MyThread implements Runnable {
private LockSample _counter;
public MyThread(LockSample counter) {
this._counter = counter;
}
@Override
public void run() {
_counter.increment();
}
}
}
ReentrantLockクラスでlockメソッドを利用した場合には、その直後からtryブロックで括るのを忘れないようにしてください。これは処理中に思わぬ例外が発生した場合にも、finally句でunlockメソッドが呼び出されることを保証するためです。
関連ページ
synchronized






