概念
單例屬於建立型模式,在優點設計模式:可復用物件導向軟體的基礎中給出的定義:保證乙個類僅有乙個例項,並提供乙個全域性訪問點。
在記憶體中只有乙個例項,減少記憶體開銷,避免頻繁建立和銷毀例項實現方式避免對資源的多重占用
物件的產生是由構造器完成的,單例就是通過將建構函式變為私有的,使外部不能通過引用來產生物件。同時為了保證類的可用性,就必須提供乙個自己的對像以及乙個訪問該物件的靜態方法餓漢式實現
測試/**
* 餓漢式單例.
* 通過static的靜態初始化方式,在該類第一次被載入的時候,
* 就有乙個******singleton的例項被建立出來了.
* 這樣就保證在第一次想要使用該物件時,他已經被初始化好了.
*/public
class
singleton
public
static singleton getinstance()
}
jdk中單例的實現@test
public
void
testsingleton()
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...