激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java中的雙重檢查(Double-Check)詳解

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

2020-04-06 11:2988250 JAVA教程

這篇文章主要為大家詳細(xì)介紹了Java中的雙重檢查(Double-Check),感興趣的小伙伴們可以參考一下

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

?
1
2
3
4
5
6
7
8
9
10
public Resource getResource() {
 if (resource == null) { 
  synchronized(this){ 
   if (resource==null) {
    resource = new Resource(); 
   }  
  
 }
 return resource;
}

 該模式是對下面的代碼改進(jìn):

?
1
2
3
4
5
6
public synchronized Resource getResource(){
 if (resource == null){ 
    resource = new Resource(); 
 }
 return resource;
}

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

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

?
1
2
3
4
5
6
7
8
9
10
11
private int count;
public int getCount(){
 if (count == 0){ 
  synchronized(this){ 
   if (count == 0){
    count = computeCount(); //一個耗時的計(jì)算
   }  
  
 }
 return count;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
private volatile Resource resource;
public Resource getResource(){
 if (resource == null){ 
  synchronized(this){ 
   if (resource==null){
    resource = new Resource(); 
   }  
  
 }
 return resource;
}

 當(dāng)然了,得是在遵循 JSR133 規(guī)范的 Java 中。

所以,double-check 在 J2SE 1.4 或早期版本在多線程或者 JVM 調(diào)優(yōu)時由于 out-of-order writes,是不可用的。 這個問題在 J2SE 5.0 中已經(jīng)被修復(fù),可以使用 volatile 關(guān)鍵字來保證多線程下的單例。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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),

?
1
2
3
4
5
6
7
8
9
public class Singleton {
  static class SingletonHolder {
    static Singleton instance = new Singleton();
  }
   
  public static Singleton getInstance(){
    return SingletonHolder.instance;
  }
}

以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性爱在线免费视频 | 午夜视频免费在线观看 | 久久精品成人影院 | 久久久久久久久久久亚洲 | 久久亚洲春色中文字幕久久 | 中文字幕在线观看精品 | 免费一级特黄做受大片 | 国产毛片在线看 | 国产精品午夜未成人免费观看 | 国产无遮挡成人免费视频 | 色中色在线视频 | 黄色影院在线观看视频 | 蜜桃久久一区二区三区 | 国产精品久久久久久久久久尿 | 欧美一区欧美二区 | 激情av在线 | 羞羞答答影院 | 日韩电影一区二区 | 欧美偷拍一区二区 | 日韩欧美精品中文字幕 | 午夜影院在线免费观看 | 亚洲国产精品久久久久久久久久久 | 成人永久免费 | 国产乱乱视频 | 国产日韩三区 | 在线成人免费视频 | 一级做人爱c黑人影片 | 国产精品成人av片免费看最爱 | sesee99| 欧美一级毛片特黄黄 | 国产精品午夜一区 | 免费黄色小视频网站 | 国产精品成人亚洲一区二区 | 色婷婷一区二区三区 | 91久久线看在观草草青青 | 黄色网战在线看 | 人人舔人人射 | 中文字幕亚洲一区二区三区 | 成人在线观看网 | 久久无 | 欧美偷拍一区二区 |