Effective Java 第二版 中文版 筆記(三)列舉實現單例模式
阿新 • • 發佈:2018-12-09
列舉實現單例模式:
public enum DataSourceEnum {
DATASOURCE;
private DBConnection connection = null;
private DataSourceEnum() {
connection = new DBConnection();
}
public DBConnection getConnection() {
return connection;
}
}
(二)經典單例模式
1、餓漢式單例(立即載入方式)
餓漢式單例在類載入初始化時就建立好一個靜態的物件供外部使用,除非系統重啟,這個物件不會改變,所以本身就是執行緒安全的。
// 餓漢式單例
public class Singleton {
// 私有構造
private Singleton() {}
private static Singleton single = new Singleton();
// 靜態工廠方法
public static Singleton getInstance() {
return single;
}
}
2、懶漢式單例(延遲載入方式)
該示例雖然用延遲載入方式實現了懶漢式單例,但在多執行緒環境下會產生多個single物件
// 懶漢式單例 public class Singleton { // 私有構造 private Singleton() {} private static Singleton single = null; public static Singleton getInstance() { if(single == null){ single = new Singleton(); } return single; } }
新增同步鎖
public class Singleton { // 私有構造 private Singleton() {} private static Singleton single = null; public static Singleton getInstance() { // 等同於 synchronized public static Singleton getInstance() synchronized(Singleton.class){ // 注意:裡面的判斷是一定要加的,否則出現執行緒安全問題 if(single == null){ single = new Singleton(); } } return single; } }
該方式執行效率卻很低。
public class SingletonFactory {
// 內部列舉類
private enum EnmuSingleton{
Singleton;
private Singleton singleton;
//列舉類的構造方法在類載入是被例項化
private EnmuSingleton(){
singleton = new Singleton();
}
public Singleton getInstance(){
return singleton;
}
}
public static Singleton getInstance() {
return EnmuSingleton.Singleton.getInstance();
}
}
class Singleton{
public Singleton(){}
}