public
class
singletondemo
public
static singletondemo getinstace()
return instace;
}public
static
void
main
(string[
] args)
}// main方法只進入一次,說明只new了一次物件。getinstance多次都是true 驗證了單例
上述的**在單機模式下是沒有問題的,但如果此時有多個執行緒同時去getinstance方法,就會出問題,如下:
public
static
void
main
(string[
] args)
,string.
valueof
( i )).
start()
;}}}
// main方法進入了多次,說明單例模式建立失敗,因此在多執行緒下,這種方式來建立單例是不可取的
//解決方案:可以給getinstance方法加synchronized關鍵字,但synchronized級別太重,會導致效能較差,
在加鎖前後加鎖後都進行為null判斷。
public
class
singletondemo
public
static singletondemo getinstace()
}}return instace;
}public
static
void
main
(string[
] args)
,string.
valueof
( i )).
start()
;}}}
// 列印:enter the main method ...
// 說明:main方法進入了一次,說明單例模式建立成功
說明:dcl 不一定執行緒安全,因為會存在指令重排,假如volatile可以禁止指令重排。
原因在於:某個執行緒執行第一次檢測,讀到instance不為null,可能是已經分配空間,但未完成初始化。
instance = new singltondemo()可分為三步:
2,3 沒有資料依賴關係,因此會發生指令重排
正確的解決方案:volatile+ dcl
單例模式的執行緒安全性
單例模式是設計模式中比較簡單的一種。適合於乙個類只有乙個例項的情況,比如視窗管理器,列印緩衝池和檔案系統,它們都是原型的例子。典型的情況是,那些物件的型別被遍及乙個軟體系統的不同物件訪問,因此需要乙個全域性的訪問 指標,這便是眾所周知的單例模式的應用。經典的單例模式有三種,懶漢式 餓漢式和懶漢式單例...
多執行緒安全單例模式
在文章開始之前我們還是有必要介紹一下什麼是單例模式。單例模式是為確保乙個類只有乙個例項,並為整個系統提供乙個全域性訪問點的一種模式方法。從概念中體現出了單例的一些特點 1 在任何情況下,單例類永遠只有乙個例項存在 2 單例需要有能力為整個系統提供這一唯一例項 1.全域性變數的缺點 必須在程式一開始就...
多執行緒安全的單例模式
執行緒安全的單例模式有多種寫法,下面的這種寫法是我最常用的一種 public class singleton public static singleton getinstance return singleton 兩點說明 1.給singleton加volatile關鍵字是位了禁止指令重排序,因為...