1 餓漢模式
宣告靜態物件時,已經初始化。
public
class singleton
public
static singleton getinstance()
}
2 懶漢模式
第一次呼叫getinstance時進行初始化。
缺點:每次呼叫getinstance都進行同步,造成不必要的同步開銷。
public
class singleton
private
static synchronized singleton getinstance()
return instance;
}}
3 dcl (double check lock)
第一步判空避免不必要的同步。
第二步判空是為了在instance=null時建立例項。
dcl失效:
instance = new singleton(); 分三步
1)給singleton的例項分配記憶體
2)呼叫singleton()的建構函式,初始化成員字段;
3)將instance物件只想分配的記憶體空間(此時instance就不是null了);
執行順序可能是1-2-3 也可能是1-3-2;
解決失效: private volatile static singleton instance = null;
public
class singleton
public
static singleton getinstance() }}
return instance;
}}
4 靜態內部類單例模式
public
class singleton
public
static singleton getinstance()
private
static
class singletonholder
}
第一次載入singleton類並不會初始化instance,只有第一次呼叫singleton的getinstance方法時,才會導致instance被初始化。這種方式能確保執行緒安全,也能保證單例物件的唯一性。也延遲了單例的例項化。
5 列舉單例
執行緒安全
public
enum singletonenum
為了避免反序列化會重新建立物件。需要加入如下方法
private object readresolve() throws objectstreamexception
也就是說在readresolve方法中將sinstance物件返回,而不是預設的重新生成乙個新的物件。
列舉不存在這個問題,即使反序列化也不會重新生成新的例項。
6 使用容器實現單例模式
將多種單例型別注入到乙個統一的管理類中,這種方式可以管理多種型別的單例。
public
class singletonmanger
public
static
void
setinstance(string key, object instance)
}public
static object getinstance(string key)
}
設計模式 02 單例模式
參考 需要某個類只保留乙個物件,如資料庫連線 網路連線 執行緒池等。只能有乙個例項 單例類必須建立自己的唯一例項 單列類向其他物件提供這一例項 單例可以繼承與被繼承,方法可以重寫。靜態類不行 單例產生的物件常駐記憶體。靜態類物件執行後會被釋放,被gc清理 單例模式可以延遲載入,靜態類在第一次執行時被...
設計模式 02 單例模式
餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全,同步方法 懶漢式 執行緒不安全,同步 塊 雙重檢查 推薦 靜態內部類 推薦 列舉注意事項和細節說明 所謂的單例設計模式,就是採取一定的方法,保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方...
設計模式 02 單例模式
描述 singleton 模式要求乙個類有且僅有乙個例項,並且提供了乙個全域性的訪問點 方式1 sealed class singleton 這種方式不能實現延遲初始化 呼叫時才進行初始化 它在編譯時就初始化出了乙個例項,sealed保證類不能被繼承。方式二 sealed class singlet...