單例模式都在什麼時候用?
1.windows任務管理器,回收站,一個系統只有一個。
2.web應用的配置文件,方便整個代碼共享。
。。。。
單例模式的第一種實現方式---懶漢模式(線程不安全)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void show(){
System.out.println("我是懶漢~");
}
}
單例模式的第二種實現方式---懶漢模式(線程安全)
就是在getInstance方法上加入synchronized
這種方法雖然很好的實現了懶加載,在多線程中能很好的工作,但是效率很低,大部分情況下不需要同步。
但是這種方法第一次調用的時候才初始化,避免了資源的浪費。
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void show(){
System.out.println("我是懶漢~");
}
}
單例模式的第三種實現方式---餓漢模式
優點:沒有加鎖,效率高
缺點:類加載的時候就初始化,浪費內存
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
public void show(){
System.out.println("我是餓漢~");
}
}
單例模式的第四種實現方式---雙檢鎖/雙重校驗鎖(DCL,double checked locking)
雙鎖機制,安全且在多線程的情況下保持高性能
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;
}
}