比較的完全な単例モデル
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();