四種單例設計模式
阿新 • • 發佈:2018-11-14
懶漢式
public class SingletonLazy {
private static SingletonLazy instance;
//初始化一個例項
private SingletonLazy() {};
//私有化該類的構造器
public static SingletonLazy getInstance() {//對外提供共有的訪問方式,訪問此例項物件
if (instance==null) {
instance = new SingletonLazy();
}
//如果沒有例項,就建立一個
return instance;
//返回例項物件
}
}
餓漢式
public class SingletonHungary {
private static final SingletonHungary instance=new SingletonHungary();
//建立一個靜態的不可變的私有例項物件
private SingletonHungary() {}
//私有化該類的構造器
public static SingletonHungary getInstance() {
return instance;
}
}
雙重鎖機制DCL
public class SingletonDoubleChecking {
private static SingletonDoubleChecking instance;//初始化一個例項 private SingletonDoubleChecking() {}//私有化構造器 public static SingletonDoubleChecking getInstance() {//對外提供共有的訪問該例項的方法 if (instance==null) {//檢查是否為空,不為空時不檢查,節省效能消耗;為空時可能有併發問題 synchronized (SingletonDoubleChecking.class) { if (instance==null) { instance =new SingletonDoubleChecking(); } } } return instance; }
}
列舉
/**
- 列舉式單例,列舉的建立由JVM保證,因此不會出現併發問題,構造器自動私有,外部不能建立,只能引用
- 用法為:SingletonEnum.INSTANCE.doSomething();
*/
public enum SingletonEnum {
//唯一例項,預設為public static final的
INSTANCE;
public String name;
public void doSomething(){
System.out.println(“doSomething”);
}
public static void main(String[] args) {
SingletonEnum.INSTANCE.doSomething();
}
}
四種表現形式的區別
餓漢式跟懶漢式的話他們兩個都是執行緒不安全的,餓漢式是在類載入的時候就建立例項物件,而懶漢式是當需要用到該例項的時候他才去建立一個例項,開發當中一般用的餓漢式。
另外就要說到雙重鎖機制DCL了,它是執行緒安全的,當遇到併發的時候,它能很好的起作用,先判斷例項為不為NULL,不為空則不用管,直接返回該例項就行了,當它為NULL時,就用synchronized為它加鎖,再次判斷是否為空,為空就建立例項,不為空就返回例項。
列舉在例子中有介紹
他們四種方式共有的操作步驟就是:先私有化一個例項物件,再私有化該類的構造器,然後對外提供共有的訪問方式來訪問該例項物件,細微的差別就是建立例項的時間。