入れ子が深くなりがちなダブルチェックロッキングの構文。
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