雙鎖檢查通常寫爲:Singleton設計模式
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
}
return instance; //4
}
在上面的代碼中,假設10個線程調用這個方法,所有的人都越過了第一個if條件,那麼一個線程進入同步塊並創建實例。即使創建了實例,剩餘的9個線程也會一個接一個地等待,並通過synchronized塊順序進入。我希望一旦任何線程創建Singleton實例,所有其他線程都不應該等待。告訴我是否有解決方案?
Bill Pugh是你的英雄:http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh – eSniff 2011-12-22 06:03:16
@Mitch:那篇文章已經9歲了。雙重檢查鎖定可以在任何非古董虛擬機中安全工作;但它不是實例化單例的最佳方式。 – 2011-12-22 06:11:53
@Mitch:啊!這太糟糕了,只要你知道它今天不是直接適用的,它仍然是一個很好的和信息豐富的閱讀。這裏又是:http://www.ibm.com/developerworks/java/library/j-dcl/index.html。隨後討論了在新內存模型下安全雙重檢查鎖定的缺點:http://www.ibm.com/developerworks/library/j-jtp03304/#3.2 – 2011-12-22 06:22:59