【同時プログラミング】8種類の単例モード
8257 ワード
単一モード
1、餓漢式(静態定数)-利用可能
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
2、餓漢式(静態コードブロック)-使用可能
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {}
public Singleton getInstance() {
return instance;
}
}
3、怠け者(スレッドが安全でない)-使用できない
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
4、怠け者式(スレッド安全、同期方法)-推奨しない
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
5、怠け者(スレッドが安全で、コードブロックを同期する)-使用できない
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
6、二重検査-推奨用
/**
* -》
*
*/
@ThreadSafe
public class SingletonExample5 {
//
private SingletonExample5() {
}
// 1、memory = allocate()
// 2、ctorInstance()
// 3、instance = memory instance
// volatile + ->
private volatile static SingletonExample5 instance = null;
//
public static SingletonExample5 getInstance() {
if (instance == null) { // // B
synchronized (SingletonExample5.class) { //
if (instance == null) {
instance = new SingletonExample5(); // A - 3
}
}
}
return instance;
}
}
7、静的内部クラス-推奨用
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
8、列挙-推奨用
/**
* :
*/
@ThreadSafe
@Recommend
public class SingletonExample7 {
//
private SingletonExample7() {
}
public static SingletonExample7 getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonExample7 singleton;
// JVM
Singleton() {
singleton = new SingletonExample7();
}
public SingletonExample7 getInstance() {
return singleton;
}
}
}