單例模式 JDK中的實現

2021-10-25 10:00:44 字數 2935 閱讀 8271

概念

單例屬於建立型模式,在

設計模式:可復用物件導向軟體的基礎中給出的定義:保證乙個類僅有乙個例項,並提供乙個全域性訪問點。

優點

在記憶體中只有乙個例項,減少記憶體開銷,避免頻繁建立和銷毀例項

避免對資源的多重占用

實現方式

物件的產生是由構造器完成的,單例就是通過將建構函式變為私有的,使外部不能通過引用來產生物件。同時為了保證類的可用性,就必須提供乙個自己的對像以及乙個訪問該物件的靜態方法

餓漢式實現

/**

* 餓漢式單例.

* 通過static的靜態初始化方式,在該類第一次被載入的時候,

* 就有乙個******singleton的例項被建立出來了.

* 這樣就保證在第一次想要使用該物件時,他已經被初始化好了.

*/public

class

singleton

public

static singleton getinstance()

}

測試

@test

public

void

testsingleton()

jdk中單例的實現

public

class

runtime

private

runtime()

}

以上**為jdk中runtime類的部分實現,在該類第一次被classloader載入的時候,這個例項就被建立出來了。

一般不能例項化乙個runtime物件,應用程式也不能建立自己的 runtime 類例項,但可以通過 getruntime 方法獲取當前runtime執行時物件的引用。

靜態內部類方式

實現

/**

* 靜態內部類式.

*/public

class

singleton2

private

singleton2()

public

static singleton2 getinstance()

}

說明

這種方式同樣利用了 classloader 機制來保證初始化 instance 時只有乙個執行緒;

餓漢式:只要 singleton 類被裝載了,那麼 instance 就會被例項化(沒有達到 lazy loading 效果)

靜態內部類式: singleton 類被裝載了,instance 不一定被初始化。因為 singletonholder 類沒有被主動使用,只有通過顯式呼叫 getinstance 方法時,才會顯式裝載 singletonholder 類,從而例項化 instance

懶漢式

/**

* 懶漢模式.

*/public

class

singletonlazy

public

static singletonlazy getinstance()

return singletonlazy;

}}

測試

@test

public

void

testsingletonlazybycdl()

throws exception

finally};

scheduler.

submit

(run);}

countdownlatch.

await()

; scheduler.

shutdown()

; set.

foreach

(s -

>);

assertthat

(set)

.hassize(1);}

雙重校驗鎖式

/**

* 使用雙重校驗鎖方式實現單例.

*/public

class

singletonlazy2

implements

serializable

private object readresolve()

//對外提供獲取例項的靜態方法,對**塊加鎖,縮小鎖的範圍

public

static singletonlazy2 getinstance()

}}return singletonlazy2;

}}

說明

使用 synchronized 同步**塊的方式縮小鎖的範圍

使用 volatile 關鍵字禁止指令重排序: new singletonlazy2()在jvm類載入機制中,在準備階段(preparation)存在給 singletonlazy2 賦值事務可能;

定義 readresolve 方法防止序列化對單例的破壞

總結

**

github: 單例code

最後

要記得什麼是設計模式,也要忘記什麼是設計模式

jdk 中Runtime之單例模式 學習

這段 是我從原始碼中擷取的,大家很容易看到currentruntime是乙個靜態變數,getruntime對應的就是getinstacne。不是說這種方法不好嗎?1 public class runtime 1213 1 package heelo 2class execdemo 11 proces...

C 中實現單例模式

單例模式是軟體工程中廣為人知的設計模式。單例模式就是指乙個永遠只能例項化一次。使用的方式是呼叫類裡建立的靜態方法。通常來說,單例模式建立的類,都是不帶形參的 原因就是當建立多個例項的時候,如果引數不同的話 比如2個不同的過載建構函式 那麼就會造成一些不必要的問題 如果相同的例項要被建立而且他們使用相...

java中單例模式的實現

lazy loaded thread safe單例模式實現 dcl double checked locking 實現法 double checked locking 顧名思義,就是雙檢查法,檢查例項instance是否為null或者已經例項化了。public class doublechecked...