更新時(shí)間:2020-11-09 17:28:12 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1352次
?單例對(duì)象(Singleton)是一種常用的設(shè)計(jì)模式。在Java應(yīng)用中,單例對(duì)象能保證在一個(gè)JVM中,該對(duì)象只有一個(gè)實(shí)例存在。正是由于這個(gè)特點(diǎn),單例對(duì)象通常作為程序中的存放配置信息的載體,因?yàn)樗鼙WC其他對(duì)象讀到一致的信息。對(duì)于一個(gè)軟件系統(tǒng)中的某些類而言,只有一個(gè)實(shí)例很重要,例如一個(gè)系統(tǒng)只能有一個(gè)窗口管理器或文件系統(tǒng),一個(gè)系統(tǒng)只能有一個(gè)集市工具或ID生成器等等。本文就和大家一起探討一下在多線程環(huán)境下,單例模式的相關(guān)問(wèn)題。
單例模式的定義:確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)來(lái)訪問(wèn)這個(gè)唯一實(shí)例。
1. 單例對(duì)象的屬性(或成員變量)的獲取,是通過(guò)單例對(duì)象的初始化實(shí)現(xiàn)的。也就是說(shuō),在單例對(duì)象初始化時(shí),會(huì)從文件或數(shù)據(jù)庫(kù)中讀取最新的配置信息。
2. 其他對(duì)象不能直接改變單例對(duì)象的屬性,單例對(duì)象屬性的變化來(lái)源于配置文件或配置數(shù)據(jù)庫(kù)數(shù)據(jù)的變化。
多線程單例模式的實(shí)現(xiàn):
一、基于餓漢式單例:
實(shí)例代碼
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
if(s1 == s2){
System.out.println("兩個(gè)對(duì)象是相同實(shí)例");
}
else{
System.out.println("兩個(gè)對(duì)象是不同實(shí)例");
}
}
}
二、基于懶漢式單例
實(shí)例代碼
public class Singleton {
private Singleton() {
}
//靜態(tài)內(nèi)部類
private static class SingletonHandler {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHandler.instance;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println("兩個(gè)對(duì)象實(shí)例是否相同?");
System.out.println(s1 == s2);
}
}
三、餓漢式與懶漢式的比較:
餓漢式單例類在類加載時(shí)就將自己實(shí)例化,它的優(yōu)點(diǎn)在于無(wú)需考慮多個(gè)線程同時(shí)訪問(wèn)的問(wèn)題,可以確保實(shí)例的唯一性;從調(diào)用速度和反應(yīng)時(shí)間速度來(lái)講,由于單例對(duì)象一開始就得以創(chuàng)建,因此要優(yōu)于懶漢式單例。但是無(wú)論系統(tǒng)在運(yùn)行時(shí)是否需要使用該單例對(duì)象,由于在類加載時(shí)該對(duì)象就需要?jiǎng)?chuàng)建,因此從資源利用效率角度來(lái)講餓漢式單例不及懶漢式單例,而且在系統(tǒng)加載時(shí)由于需要?jiǎng)?chuàng)建餓漢式單例對(duì)象,加載時(shí)間可能會(huì)比較長(zhǎng)。
懶漢式單例類在第一次使用時(shí)創(chuàng)建,無(wú)須一直占用系統(tǒng)資源,實(shí)現(xiàn)了延遲加載,但是必須要處理多個(gè)線程同時(shí)訪問(wèn)的問(wèn)題,特別是當(dāng)單例類作為資源控制器,在實(shí)例化時(shí)必然涉及資源初始化,而資源初始化很有可能耗費(fèi)大量時(shí)間,這意味著出現(xiàn)多線程同時(shí)首次引用此類的幾率比較大,需要通過(guò)同步化機(jī)制進(jìn)行控制。
單例模式的主要優(yōu)點(diǎn)在于提供了對(duì)唯一實(shí)例的受控訪問(wèn)并可以節(jié)約系統(tǒng)資源;其主要缺點(diǎn)在于因?yàn)槿鄙俪橄髮佣y以擴(kuò)展,且單例類職責(zé)過(guò)重。至于我們?cè)?a href="/javathread/" target="_self" style="color: rgb(192, 0, 0); text-decoration: underline;">多線程中實(shí)際運(yùn)用單例模式時(shí)采用惡漢式還是懶漢式單例類需要根據(jù)實(shí)際情況,對(duì)照上述的兩者的特征做出合適的選擇。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743