Çift Kontrollü Kilitleme. Genel olarak.
BEA'da çalışırken yaşadığım sorunları öğrenmeye başladığım paradigma, insanların bir singletonu şu şekilde kontrol edeceğidir:
public Class MySingleton {
private static MySingleton s_instance;
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) { s_instance = new MySingleton(); }
}
return s_instance;
}
}
Bu asla işe yaramaz, çünkü senkronize edilmiş bloğa başka bir iş parçacığı girmiş olabilir ve s_instance artık null değildir. Böylece doğal değişim bunu yapmaktır:
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) {
if(s_instance == null) s_instance = new MySingleton();
}
}
return s_instance;
}
Java Bellek Modeli bunu desteklemediğinden bu da işe yaramaz. Çalışması için s_instance değişkenini deklare etmeniz gerekir ve o zaman bile sadece Java 5 üzerinde çalışır.
Java Bellek Modeli'nin karmaşıklıklarına aşina olmayan insanlar bunu her zaman berbat eder .