Java單例模式

2021-08-21 06:16:38 字數 1867 閱讀 5289

單例模式,是一種常用的軟體設計模式。單例物件的類必須保證只有乙個例項存在。

很多時候我們只需要乙個全域性物件,可以避免多個物件占用記憶體資源,也可以方便我們管理一些配置資訊。通常我們用getinstance來獲取該物件單例例項

對單例的實現,有兩種構建方式:

先來看一下懶漢式單例的實現方式。

public

class single

public

static single getinstance() }}

return instance;

}}

kotlin方式

public doublechecksingleton private

constructor

}}

指令重排:計算機為了提高執行效率,會做的一些優化,在不影響最終結果的情況下,可能會對一些語句的執行順序進行調整

volatile :禁止指令重排,在它的賦值完成之前,不會呼叫讀操作

synchronized 同步鎖:會強制除當前之外的所有執行緒等待,實際上會對程式的執行效率造成負面影響

private:構造器改為私有的,這樣能夠防止被外部的類呼叫

注意其中有兩次if (instance == null)的判斷,這個叫做『雙重檢查 double-check』:

* 第乙個if (instance == null),其實是為了解決效率問題,只有instance為null的時候,才進入synchronized的**段——大大減少了機率。

* 第二個if (instance == null),是為了防止可能出現多個例項的情況。

餓漢式單例的實現方式。

public

class single

public

static single getinstance()

}

kotlin方式

餓漢式在kotlin中,只需要乙個object修飾符就行了,這就是kotlin非常厲害的地方。

object

basesingleton

對於餓漢式來說,能避免多執行緒情況,但是它的例項是在類載入的時候就建立了

缺點:

1.可能由於初始化的太早,造成資源的浪費

2.如果初始化本身依賴於一些其他資料,那麼也就很難保證其他資料會在它初始化之前準備好。

public

class singleton

private

singleton (){}

public

static singleton getinstance()

}

kotlin方式

public innerstarticsingleton private

constructor

private

object

holder

}

public

class test

static

int num = 4; //2.第二步,靜態變數和靜態**塊的載入順序由編寫先後決定

int a = 5; //6.第六步,按照順序載入變數

test()

static

static

void run() // 靜態方法,呼叫的時候才載入// 注意看,e沒有載入

}

java單例模式

第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...

Java 單例模式

單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...

Java單例模式

單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...