国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中的雙重檢查(Double-Check)詳解

2019-11-26 14:32:01
字體:
來源:轉載
供稿:網友

在 Effecitve Java 一書的第 48 條中提到了雙重檢查模式,并指出這種模式在 Java 中通常并不適用。該模式的結構如下所示:

public Resource getResource() {  if (resource == null) {    synchronized(this){     if (resource==null) {     resource = new Resource();     }     }   }  return resource; }

 該模式是對下面的代碼改進:

public synchronized Resource getResource(){  if (resource == null){      resource = new Resource();   }  return resource; } 

這段代碼的目的是對 resource 延遲初始化。但是每次訪問的時候都需要同步。為了減少同步的開銷,于是有了雙重檢查模式。

在 Java 中雙重檢查模式無效的原因是在不同步的情況下引用類型不是線程安全的。對于除了 long 和 double 的基本類型,雙重檢查模式是適用 的。比如下面這段代碼就是正確的:

private int count; public int getCount(){  if (count == 0){    synchronized(this){     if (count == 0){     count = computeCount(); //一個耗時的計算    }     }   }  return count; } 

 上面就是關于java中雙重檢查模式(double-check idiom)的一般結論。但是事情還沒有結束,因為java的內存模式也在改進中。Doug Lea 在他的文章中寫道:“根據最新的 JSR133 的 Java 內存模型,如果將引用類型聲明為 volatile,雙重檢查模式就可以工作了”。所以以后要在 Java 中使用雙重檢查模式,可以使用下面的代碼:

private volatile Resource resource; public Resource getResource(){  if (resource == null){    synchronized(this){     if (resource==null){     resource = new Resource();     }     }   }  return resource; } 

 當然了,得是在遵循 JSR133 規范的 Java 中。

所以,double-check 在 J2SE 1.4 或早期版本在多線程或者 JVM 調優時由于 out-of-order writes,是不可用的。 這個問題在 J2SE 5.0 中已經被修復,可以使用 volatile 關鍵字來保證多線程下的單例。

public class Singleton {   private volatile Singleton instance = null;   public Singleton getInstance() {     if (instance == null) {       synchronized(this) {         if (instance == null) {           instance = new Singleton();         }       }     }     return instance;   } } 

推薦方法 是Initialization on Demand Holder(IODH),

public class Singleton {   static class SingletonHolder {     static Singleton instance = new Singleton();   }      public static Singleton getInstance(){     return SingletonHolder.instance;   } } 

以上就是本文的全部內容,希望對大家學習java程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛隆县| 巴林左旗| 彭阳县| 札达县| 永靖县| 镇坪县| 调兵山市| 麻江县| 霍城县| 迭部县| 商水县| 梓潼县| 凤山县| 长泰县| 霸州市| 苗栗县| 扶沟县| 芮城县| 潮州市| 安塞县| 永和县| 和林格尔县| 封丘县| 金阳县| 大同县| 缙云县| 鄢陵县| 德兴市| 夏津县| 蒙城县| 海林市| 酒泉市| 云梦县| 元朗区| 九江县| 西平县| 福清市| 北京市| 周至县| 伽师县| 西平县|