Javaで変数をロックする方法

Javaでは、変数にロックをかけるためにsynchronizedキーワードを使用できます。ロックの目的は、一度に1つのスレッドのみがロックされた変数にアクセスできるようにすることです。

変数にロックをかける方法を示すサンプルコードを次に示します。

public class LockExample {
    private Object lock = new Object();
    private int counter = 0;
    
    public void increment() {
        synchronized (lock) {
            counter++;
        }
    }
}

上記の例では、synchronizedキーワードはincrement()メソッドのcounter変数にロックをかけるために使用されています。あるスレッドがincrement()メソッドに入ると、lockオブジェクトのロックを取得しようとします。ロックが使用可能な場合、スレッドはロックを取得してcounter変数に対する操作を実行します。ロックが使用できない場合、スレッドはロックが解放されるまでブロックされます。

ロックは変数ではなくオブジェクト単位である点に注意。つまり、異なるオブジェクトに行ったロックは無効です。したがって、複数のスレッド間で共有される変数には必ず同一のロックオブジェクトを使用してください。

さらに、より柔軟なロック機構を実装するために、ReentrantLockクラスを使用することもできます。ReentrantLockは再入可能ロック、フェアロックなどのより多くの機能を提供します。具体的な使用方法については、Java公式ドキュメントまたは関連チュートリアルを参照してください。

bannerAds