public
class
singleton
public
static singleton getuniqueinstance()
}}return uniqueinstance;
}}
上面的**中,建立乙個私有的構造方法,避免外部建立類的示例;然後定義乙個靜態的類的例項,外部通過getuniqueinstance獲取此靜態示例,以此實現單例;用雙重檢查鎖保證執行緒安全。
另外,需要注意 uniqueinstance 採用 volatile 關鍵字修飾也是很有必要。
uniqueinstance 採用 volatile 關鍵字修飾也是很有必要的, uniqueinstance = new singleton(); 這段**其實是分為三步執行:
為 uniqueinstance 分配記憶體空間
初始化 uniqueinstance
將 uniqueinstance 指向分配的記憶體位址
但是由於 jvm 具有指令重排的特性,執行順序有可能變成 1->3->2。指令重排在單執行緒環境下不會出現問題,但是在多執行緒環境下會導致乙個執行緒獲得還沒有初始化的例項。例如,執行緒 t1 執行了 1 和 3,此時 t2 呼叫 getuniqueinstance() 後發現 uniqueinstance 不為空,因此返回 uniqueinstance,但此時 uniqueinstance 還未被初始化。
使用 volatile 可以禁止 jvm 的指令重排,保證在多執行緒環境下也能正常執行。
懶漢式和懶漢式執行緒安全(雙檢索)
首先寫乙個單例的懶漢模式 package thread 懶漢模式 public class sluggard public static sluggard getintance return instance 懶漢模式就是物件等到需要的時候在建立,單例執行緒不安全的,但是怎麼變得安全呢?第一種方式 ...
執行緒安全的雙重檢查單例模式
雙重檢查實現單例模式本身是執行緒不安全的,主要原因在於 instance new doublechecksingleton 這句 非原子操作,而編譯器又存在指令重排序的問題,1 先分配記憶體,然後將 instance 指向該記憶體,這時 instance 並不為空,但並未初始化,若此時執行緒2呼叫 ...
Java雙重檢查鎖的錯誤
1.錯誤的雙重檢查鎖實現 public class doublecheckedlocking 8 9 return instance 10 11 前面的雙重檢查鎖定示例 的第7行 instance new singleton 建立了乙個物件。這一行 可以分解為如下的3行偽 memory alloca...