單例模式 懶漢模式(2)

2021-08-20 05:16:15 字數 1812 閱讀 2311

第一種懶漢模式是執行緒不安全的,那麼如何使其變成執行緒安全呢?只需要加乙個synchronized關鍵字,**如下。
第二種寫法:

public classsingleton2 

private staticsingleton2

instance

=null;

public static synchronizedsingleton2 getinstance()

returninstance

; }

}

優點:由於加了synchronized關鍵字,使得同一時刻只有乙個執行緒能訪問,保證了執行緒的安全。

缺點:由於加了synchronized關鍵字,使得同一時刻只有乙個執行緒能訪問,增加了系統時間開銷。

第三種寫法:

public classsingleton3 

private staticsingleton3 instance

=null;

public staticsingleton3 getinstance() }}

returninstance

; }

}

雙重同步鎖單例模式

相比第二種寫法該方法減少了時間開銷,通過雙重同步鎖來獲取單例。但是該種寫法也是執行緒不安全的。

原因:首先要說一下cpu指令,該段**涉及到3個cpu指令。

1、memory = allocate()分配記憶體看空間。

2、ctorinstance()初始化物件。

3、instance = memory 設定instance指向剛才分配的記憶體。

由於jvm和cpu的優化,可能會導致指令的重排。

1、memory = allocate()分配記憶體看空間。

3、instance = memory 設定instance指向剛才分配的記憶體。

2、ctorinstance()初始化物件。

當執行緒a執行到1(第二個if判斷的時候)建立了物件,然後執行了重排序後的cpu指令3(instance = memory)

此時並沒有初始化。此時b執行緒執行,判斷instance不為空,返回instance(注意:此時的instance並沒有初始化)所以產生了執行緒不安全。

上述問題的關鍵就在於cpu指令重排,只要解決這個問題也就解決了執行緒不安全問題。

第四種寫法:

public classsingletonexample5 

//單列物件

//使用 volatile+雙重檢測機制 禁止指令重排

private volatile staticsingletonexample5 instance

=null;

//靜態工廠方法(多執行緒下可能會出現問題)

public staticsingletonexample5 getinstance() }}

returninstance

; }

}

使用volatile關鍵字禁止指令重排

單例模式 懶漢模式

在實際應用中,我們往往希望在使用的時候才進行類的載入,而不希望類初始化的時候就進行載入,所以單例模式又有了另外一種實現,懶漢模式 一.延遲載入 如下 public class myobject public static myobject getinstance return myobject 延遲...

單例模式 懶漢模式

因為在設計或開發中,肯定會有這麼一種情況,乙個類只能有乙個物件被建立,如果有多個物件的話,可能會導 致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使 用的情形也不相同。今天要實現的是常用的三種,分別是餓漢式 懶漢式和多執行緒式。單例模式的要點有三...

懶漢單例模式

單例設計模式 懶漢單例模式 能夠保證在只有用它的時候才建立它的物件。目前還不能保證乙個類在記憶體中只有乙個物件。懶漢單例模式設計步驟 1 私有化建構函式 2 生命本類的引用型別變數,但是不要建立物件 3 提供公共的靜態方法獲取本類的物件,獲取之前先判斷是否已經建立了本類的物件,如果已經建立了,那麼直...