Javaで楽観的ロックを実装するためのマルチスレッドコードの書き方

オプティミスティックロックは、並行アクセスにおいて競合が発生しないことを前向きに捉えるロック機構で、読み取りが多く書き込みが少ない場面に適用されます。Javaでは、AtomicIntegerクラスを使用してオプティミスティックロックを実装できます。

以下は、楽観的ロックを使用してマルチスレッドの同時アクセスを共有変数に実装する方法を示す簡単なサンプルコードです。

import java.util.concurrent.atomic.AtomicInteger;

public class OptimisticLockExample {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        Thread thread1 = new Thread(new IncrementTask());
        Thread thread2 = new Thread(new IncrementTask());

        thread1.start();
        thread2.start();

        try {
            // 等待线程执行完成
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Counter: " + counter);
    }

    static class IncrementTask implements Runnable {
        @Override
        public void run() {
            int oldValue, newValue;
            do {
                oldValue = counter.get();
                newValue = oldValue + 1;
            } while (!counter.compareAndSet(oldValue, newValue));
        }
    }
}

AtomicIntegerクラスを使用して共有変数counterを定義し、各スレッドのrunメソッドではcounterの値の読み書きを繰り返し、compareAndSetメソッドが成功するまでcounterに新しい値を書き込み続けます。これにより、複数のスレッドによるcounterの同時書き込みによる競合を防ぎます。

なお、楽観的ロックは読み込みが多く書き込みが少ない场景に適しており、同時書き込みが発生する場合、パフォーマンスに影響が出る場合があります。その場合は悲観的ロックを採用することでデータの一貫性を確保できます。

bannerAds