Eager Singleton(及時Singleton)
public class eagerSingleton {
private static final eagerSingleton INSTANCE = new eagerSingleton();
private eagerSingleton(){};
public static eagerSingleton getInstance() {
return INSTANCE;
}
}
//這是eager singleton因為一旦class initiate, instance就存在了
Lazy Singleton(懶惰update, 等需要singleton的時候再創立)
public class lazySingleton {
private static final lazySingleton INSTANCE;
private lazySingleton(){};
public static lazySingleton getIntance() {
if(INSTANCE == null) {
INSTANCE = new lazySingleton();
}
return INSTANCE;
}
}
只有在其他人想要獲得Singleton的時候才會initialize 一個instance.
Singleton的實現在於,constructor設爲private, 這樣的話就可以控制數量,而getSingleton則設置為public.
线程安全式Singleton写法(双检索),
锁住initialize instance拿一部分代码就可以
public class Singleton {
private static volatile Singleton INSTANCE;
private Singleton(){}; //private constructor
public Singleton getIntance() {
if(INSTANCE == NULL) {
synchronized(Singleton.class) {
if(INSTANCE == NULL) {
INSTANCE = new Singleton();
}
}
}
}
}
写两遍检查的原因是,当多个进程进入第一个判断锁时,会被同步机制隔离,只有一个程序进入新建对象,再其他线程进入时,instance已经不为null,因此不会新建多个对象。
Volatile的作用:
1.保持可见性 2.不保证原子性 3.禁止指令重排.






网友评论