国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

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

2020-04-06 11:2988250 JAVA教程

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

在 Effecitve Java 一書(shū)的第 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;
}

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

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

這段代碼的目的是對(duì) resource 延遲初始化。但是每次訪問(wèn)的時(shí)候都需要同步。為了減少同步的開(kāi)銷(xiāo),于是有了雙重檢查模式。

在 Java 中雙重檢查模式無(wú)效的原因是在不同步的情況下引用類型不是線程安全的。對(duì)于除了 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(); //一個(gè)耗時(shí)的計(jì)算
   }  
  
 }
 return count;
}

 上面就是關(guān)于java中雙重檢查模式(double-check idiom)的一般結(jié)論。但是事情還沒(méi)有結(jié)束,因?yàn)閖ava的內(nèi)存模式也在改進(jìn)中。Doug Lea 在他的文章中寫(xiě)道:“根據(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)時(shí)由于 out-of-order writes,是不可用的。 這個(gè)問(wèn)題在 J2SE 5.0 中已經(jīng)被修復(fù),可以使用 volatile 關(guān)鍵字來(lái)保證多線程下的單例。

?
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;
  }
}

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

延伸 · 閱讀

精彩推薦
866
主站蜘蛛池模板: 久久99精品国产麻豆婷婷 | 中文字幕成人 | 99精品电影 | 天天插狠狠插 | 欧美日韩免费 | 国产91精品一区二区绿帽 | 日韩精品视频免费在线观看 | 一本黄色片 | 亚洲精品视频免费观看 | 在线观看国产二区 | 久久伊人麻豆 | 色女网 | 国产激情在线视频 | 亚洲精品一区二区三区在线 | 午夜私人影院 | 我我色综合| 久久精品久久久久久 | 日韩视频久久 | 岛国黄色大片 | 国产精品精品 | 黄色片免费在线 | 成人在线视频观看 | 亚洲一区二区免费视频 | 日韩视频区 | 久久久久久这里只有精品 | 国产高清在线精品一区二区三区 | 亚洲成av在线 | 欧美成人午夜视频 | 黄色av免费 | 国产精品久久国产精品 | 午夜私人影院 | 亚洲视频一区在线观看 | 国产91色 | 99精品欧美一区二区三区综合在线 | 欧美日韩国产一区二区 | 日本韩国欧美一区 | 欧美一级片在线 | 欧美伦理电影一区二区 | 精品成人 | 亚洲精品成a人在线 | caoporn视频 |