このコードは、ダブルチェック ロックのアンチパターンを示すために使用されます。
@NotThreadSafe
public class DoubleCheckedLocking {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null)
resource = new Resource();
}
}
return resource;
}
}
次のように変更して、この問題を回避できますか。
@NotThreadSafe
public class DoubleCheckedLocking {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null){
Resource r=new Resource();
resource = r;
}
}
}
return resource;
}
}
私の知る限りでは、
Resource r=new Resource();
resource = r;
そのコンパイラは、そのための事前発生関係を提供する必要があります。