2025-06-25  Java プログラミング

ダブルチェックロッキングからReadWriteLockへの書き換え

入れ子が深くなりがちなダブルチェックロッキングの構文。

public class MyClass1 {
    private final Object lock = new Object();
    private volatile Object value;

    public Object getValue() {
        if (value == null) {
            synchronized (lock) {
                if (value == null) {
                    value = "hello";
                }
            }
        }
        return value;
    }
}

return できる状況なら ブロックを分けて書くことで入れ子を浅くできます。

public class MyClass2 {
    private final Object lock = new Object();
    private volatile Object value;

    public Object getValue() {
        if (value != null) {
            return value;
        }

        synchronized (lock) {
            if (value != null) {
                return value;
            }

            value = "hello";
            return value;
        }
    }
}

ブロックを分けて書くと ReadWriteLock への書き換えも容易になります。

public class MyClass3 {
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private final Lock read = lock.readLock();
    private final Lock write = lock.writeLock();
    private volatile String value;

    public Object getValue() {
        read.lock();
        try {
            if (value != null) {
                return value;
            }
        } finally {
            read.unlock();
        }

        write.lock();
        try {
            if (value != null) {
                return value;
            }

            value = "hello";
            return value;

        } finally {
            write.unlock();
        }
    }
}
最終更新日 2025-06-25
この記事を共有しませんか?
ブックマーク ポスト