1、餓漢
/**
* 餓漢式
*/
public class Singleton {
private static Singleton instance = new Singleton();//實在餓的慌,先吃了(先創建實例)
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
2、懶漢
/**
* 懶漢式
*/
public class Singleton {
private static Singleton instance;//我還不餓,先不吃(不創建實例)
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();//這會兒我餓了,我吃(需要時創建實例)
}
return instance;
}
}
3、方法鎖
/**
* 懶漢式(synchronized 方發鎖 )線程安全,人云效率低
*/
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4、類鎖(雙判斷)
/**
* 雙重判斷 類鎖 synchronized (Singleton.class) 線程安全 效率高
*/
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {//一次判斷
synchronized (Singleton.class) {//鎖
if (instance == null) {//二次判斷
instance = new Singleton();
}
}
}
return instance;
}
}
5、靜態內部類
/**
* 靜態內部類單例模式,線程安全?
*/
public class Singleton {
private Singleton(){}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
/**
* 靜態內部類
*/
private static class SingletonHolder{
private static final Singleton instance = new Singleton();//靜態內部類內部實例化
}
}