單例模式:只能建立乙個例項,針對開發業務中乙個例項就夠了。這種情況下建議用單例模式。
如:工具類,資源類。
1. 單例模式寫法
單例模式有懶漢、餓漢、列舉、靜態內部類、雙重校驗鎖。
這裡我只寫常用的兩種:餓漢、靜態內部類。附帶的會與一些別的比較但是肯定不會寫全的。
餓漢 這種方式基於classloder機制避免了多執行緒的同步問題,不過,instance在類裝載時就例項化,在單例模式中大多數都是呼叫getinstance方法,這時候初始化instance顯然沒有達到lazy loading(延遲載入)的效果。這種適合於類開始就需要被裝載的情況
public
class car
public
static car getinstance()
public
void
drivecar(int index)
}
與之相比較的話可以看靜態內部類的寫法
靜態內部類
這種方式同樣利用了classloder的機制來保證初始化instance時只有乙個執行緒,它跟餓漢方式不同的是(很細微的差別):餓漢方式是只要singleton類被裝載了,那麼instance就會被例項化(沒有達到lazy loading效果),而這種方式是singleton類被裝載了,instance不一定被初始化。因為singletonholder類沒有被主動使用,只有顯示通過呼叫getinstance方法時,才會顯示裝載singletonholder類,從而例項化instance。想象一下,如果例項化instance很消耗資源,我想讓他延遲載入,另外一方面,我不希望在singleton類載入時就例項化,因為我不能確保singleton類還可能在其他的地方被主動使用從而被載入,那麼這個時候例項化instance顯然是不合適的。這個時候,這種方式相比餓漢方式就顯得很合理。
public
class carstaticclass
private
carstaticclass(){};
public
static final carstaticclass getinstance()
}
以上兩種是最常用的寫法。這裡在寫一種懶漢的方式,以及懶漢方式要注意的一點。
懶漢(執行緒不安全)
這種方式一般情況下,多執行緒同時呼叫的時候會建立多個物件。顯然就達不到了單例的目的。因為在乙個執行緒(a)呼叫的時候car為空。另乙個執行緒(b)呼叫的時候car也為空。那麼就會同時建立兩個car物件。也就是返回兩個car物件。所以這種寫法一般是達不到singleton的目的。但是很明顯的是lazy loading,但是由於執行緒不安全只能pass掉。
/*例項化類*/
public
class
car
public
static
synchronized car getinstance()
return car;
}public
void
drivecar(int index)
}/******************************************/
/*呼叫類這裡可以看出多執行緒的方式呼叫。**都比較簡單就沒寫注釋了*/
public
class
client
extends
thread
}public
static
void
main(string args)
}/******************************************/
/*執行結果*/
建立了car
建立了car
駕駛員已經啟動0汽車
駕駛員已經啟動0汽車
駕駛員已經啟動1汽車
駕駛員已經啟動2汽車
駕駛員已經啟動3汽車
駕駛員已經啟動4汽車
駕駛員已經啟動1汽車
駕駛員已經啟動2汽車
駕駛員已經啟動3汽車
駕駛員已經啟動4汽車
懶漢(執行緒安全)
與執行緒不安全相比,**改動很少,加了乙個鎖。也是有lazy loading的效果。但是告訴你的是這種方式效率很低。
public
class car
public
static synchronized car getinstance()
public
void
drivecar(int index)
}
至於其他的幾種方式。實際工作中好像很少看到。這裡只是做一些簡單的說明。列舉方式比較少見我覺得他的主要作用能防止反序列化重新建立新的物件。如果有例項化需求的話可以實現序列化的介面。
雙重校驗鎖的方式我是覺得沒必要。如果不是特定的場合實在沒有必要用雙重校驗鎖的方式。詳細請看
2. 說明
單例模式為什麼能夠成為單例,可能**有正常的區別也不大。認真的小夥伴們,你們看單例模式的 構造方法 他的構造方式是無參、私有的。這樣做就能做到外部不能通過new的方式建立物件。就只能通過getinstance方法來構造。而在這個方法裡面是返回的物件,這個物件已經初始化完成了。而且是final的static的。這種方式下不會有新的物件產生的。
至於是用餓漢還是靜態內部類的方式就看場景了。一般都是用餓漢,除非明確使用靜態內部類的才會用。用的時候一定保證執行緒安全。
Java設計模式之單例模式(Singleton)
前言 在總結okhttp的時候,為了管理網路請求使用到了單例模式,晚上實在沒啥狀態了,靜下心來學習總結一下使用頻率最高的設計模式單例模式。單例模式 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例特點 單例分類 1 懶漢單例 1 非執行緒安全實現 public class...
設計模式 建立型模式 單例模式 Singleton
4種單例模式 單執行緒單例 類class single private static single sin null public static single createinstance return sin 呼叫 console.writeline 單執行緒單例模式 single sin sin...
大話設計模式二十一 單例模式(Singleton)
一.單例模式定義 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。二.結構和說明 singleton負責建立singleton類自己的唯一例項,並提供乙個getinstance方法,讓外部來訪問這個類的唯一例項。三.呼叫示例圖 實現 四.控制例項個數 簡單演示如何擴充套件單例模式,控制例項數...