參考鏈接:https://www.runoob.com/design-pattern/singleton-pattern.html
一、懶漢式(線程不安全)
懶漢的意思就是我不生成實例,到使用時才生成第一個實例。
實現簡單,但因爲取唯一實例時未加鎖,因此不支持多線程。
public clsaa Singleton{
private static Singleton instance;
private Singleton();
public static Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
二、懶漢式(線程安全)
對getInstance函數進行加鎖。但此方法效率低下,因爲常見情況下都不需要同步。
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null)
singleton = new Singleton();
return singleton;
}
}
三、餓漢式
在調用獲取實例函數前就將實例初始化了,不會出現懶漢式中生成多個實例的情況,因此是線程安全的。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
四、雙重檢測鎖
多線程下安全且能保持高性能
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
爲什麼進行了雙重檢測?
參考鏈接:https://www.cnblogs.com/xz816111/p/8470048.html
五、