問題は次のとおりです。JVMがコードを並べ替える可能性があり、フィールドが異なるスレッドで常に同じであるとは限りません。これを見てください:http ://www.ibm.com/developerworks/java/library/j-dcl.html 。volatileキーワードを使用するとこれを修正できるはずですが、Java1.5より前では壊れています。
ほとんどの場合、シングルチェックロックは十分に高速です。これを試してください。
// single checked locking: working implementation, but slower because it syncs all the time
public static synchronized Singleton getInst() {
if (instance == null)
instance = new Singleton();
return instance;
}
また、効果的なjavaもご覧ください。ここには、このトピックに関するすばらしい章があります。
これを要約すると、ダブルチェックロックを行わないでください。より良いイドムがあります。