比較的完全な単例モデル

1313 ワード

public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
}
return singleton;
}
}

 
========================================================
ただし、コンカレントに関連しては、上記のコードにも問題があります.
jvm最適化命令順序のため,aは構築に成功する前にinstanceが空ではない可能性がある.
このときbはnullでないことをチェックし、呼び出し、エラーが発生します.
 
ソリューション:
instanceをvolatitle(??)に設定
 
または、静的内部クラスを使用します.
public class Foo {
    //  ,  ,  
    private static class LazyFoo {
       public static Foo foo = new Foo();
    }

    public static Foo getInstance() {
       return LazyFoo.foo;
    }
} 
 
 
============================================================
Javaの場合は
public static synchronized Singleton getInstance() {   }

あるいはもっと簡単に
private static final Singleton sample = new Singleton();