作成タイプ-一例
2131 ワード
1、餓漢式:
2、怠惰ロードのプレースホルダモード:(推奨)
Javaメカニズムでは、内部クラスSingletonHolderはgetInstance()メソッドが最初に呼び出されたときにのみロードされ(lazyが実現される)、そのロードプロセスはスレッドが安全であることが規定されているため、怠け者式の単一例に属する.内部クラスがロードされるとinstanceがインスタンス化されます.
3、怠惰ロードの普通ロックモード:
スレッドセキュリティの問題は解決しましたが、各スレッド呼び出しgetInstanceにはロックが必要です.getInstanceを最初に呼び出すときだけロックしたいのですが、次の二重検出スキームを参照してください.
4、怠惰負荷の二重検出モード:(推奨)
特にこの方式では命令並び替えの問題(命令並び替えについてはこのブログを参照)があり、instanceインスタンス変数に対してvolatileで修飾すればよいが、volatileで修飾すればinstance=new Singleton()を確保できる.対応する命令は並べ替えられません.
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return INSTANCE;
}
}
2、怠惰ロードのプレースホルダモード:(推奨)
Javaメカニズムでは、内部クラスSingletonHolderはgetInstance()メソッドが最初に呼び出されたときにのみロードされ(lazyが実現される)、そのロードプロセスはスレッドが安全であることが規定されているため、怠け者式の単一例に属する.内部クラスがロードされるとinstanceがインスタンス化されます.
public class Singleton {
private Singleton() { }
private static class SingletonHolder {
private final static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
3、怠惰ロードの普通ロックモード:
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
スレッドセキュリティの問題は解決しましたが、各スレッド呼び出しgetInstanceにはロックが必要です.getInstanceを最初に呼び出すときだけロックしたいのですが、次の二重検出スキームを参照してください.
4、怠惰負荷の二重検出モード:(推奨)
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if(instance == null) {
synchronzied(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
特にこの方式では命令並び替えの問題(命令並び替えについてはこのブログを参照)があり、instanceインスタンス変数に対してvolatileで修飾すればよいが、volatileで修飾すればinstance=new Singleton()を確保できる.対応する命令は並べ替えられません.
public class Singleton {
private static volatile Singleton instance = null; // volatile
private Singleton() { } // ,
public static Singleton getInstance() {
if(instance == null) { //
synchronzied(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}