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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 雙重檢查鎖定模式Java中的陷阱案例

雙重檢查鎖定模式Java中的陷阱案例

2022-02-25 00:46onlythinking Java教程

這篇文章主要介紹了雙重檢查鎖定模式Java中的陷阱,雙重檢查鎖定(也叫做雙重檢查鎖定優化)是一種軟件設計模式,它的作用是減少延遲初始化在多線程環境下獲取鎖的次數,尤其是單例模式下比較突出,想具體了解的小伙伴可

1、簡介

雙重檢查鎖定(也叫做雙重檢查鎖定優化)是一種軟件設計模式

它的作用是減少延遲初始化在多線程環境下獲取鎖的次數,尤其是單例模式下比較突出。

  • 軟件設計模式:解決常用問題的通用解決方案。編程中針對一些常見業務固有的模版。
  • 延遲初始化:在編程中,將對象的創建,值計算或其他昂貴過程延遲到第一次使用時進行。
  • 單例模式:在一定范圍內,只生成一個實例對象。

 

2、Java中的雙重檢查鎖定

單例模式我們需保證實例只初始化一次。

下面例子在單線程環境奏效,多線程環境下會有線程安全問題(instance被初始化多次)。

private static Singleton instance;
public static Singleton getInstance() {
  if (null == instance) {
      instance = new Singleton();
  }
  return instance;
}

下面例子主要是性能問題。首先加鎖操作開銷很大,因為線程安全發生在對象初始化,而這里做了做了全局控制,造成浪費。

public synchronized static Singleton getInstance() {
  if (null == instance) {
      instance = new Singleton();
  }
  return instance;
}

為了控制線程安全又能保證性能,雙重檢查鎖定模式出現。

public static Singleton getInstance() {
  if (null == instance) {
      synchronized (Singleton.class) {
          if (null == instance) {
              instance = new Singleton();
          }
      }
  }
  return instance;
}

邏輯如下:

雙重檢查鎖定模式Java中的陷阱案例

我們分析一下執行邏輯:

假設有三個線程 T1 T2 T3 ,依次訪問 getInstance 方法。

  • T1 第一次檢查為Null 進入同步塊,T1持有鎖,第二次檢查為Null 執行對象創建。
  • T2 第一次檢查為Null 進入同步塊,T2等待T1釋放鎖,鎖釋放后,T2進入執行第二次檢查不為Null,返回實例對象。
  • T3 第一次檢查不為Null,直接返回對象。

雙重檢查鎖定模式Java中的陷阱案例

上面一切似乎很完美,但是這里面存在陷阱。根據Java內存模型我們知道,編譯器優化處理會進行重排序。

instance = new Singleton() 大體分兩個步驟;

  • 1 創建初始化對象;
  • 2 引用賦值。

而 1 2 步驟可能顛倒,會造成對象屬性在初始化前調用的錯誤。

private static Singleton instance;
...
instance = new Singleton();
...

public class Singleton {
  private int age;
  public Singleton() {
      this.age = 80;
  }
}


這種細微的錯誤不容易出現,但是它的確存在。大家可以參考下面這份報告,里面詳細記錄這個問題。

雙重檢查鎖定模式Java中的陷阱案例

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

 

3、列舉方案

報告里面也列舉了幾種解決方案

3.1 利用 ThreadLocal

private static final ThreadLocal<Singleton> threadInstance = new ThreadLocal<>();
public static Singleton getInstance() {
  if (null == threadInstance.get()) {
      createInstance();
  }
  return instance;
}
private static void createInstance() {
  synchronized (Singleton.class) {
      if (instance == null)
          instance = new Singleton();
  }
  threadInstance.set(instance);
}

3.2 利用volatile(解決重排序問題)

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

下面是不同方案下的性能比較報告

http://www.cs.umd.edu/~pugh/java/memoryModel/DCL-performance.html

 

4、總結

本章節主要記錄了雙重檢查鎖定模式使用中應該注意的細微事項。

請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.onlythinking.com/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 自拍偷拍欧美 | 亚洲免费视频网站 | 国产在线中文字幕 | 91精品一区二区 | 日韩成人在线视频 | 天天干人人 | 欧美日韩久久精品 | 激情综合色综合久久综合 | 性色av一区二区 | 色综合久久88色综合天天 | 久久久久久毛片免费看 | 国产一区不卡 | 一本大道av伊人久久综合 | 久久婷婷色 | 欧美日韩中文字幕在线 | 国产黄色一级录像 | 女人久久久 | 91久久精品国产91久久性色tv | 国产黄色免费网站 | 亚洲 欧美 日韩在线 | 综合色区 | 欧美成人免费 | 亚洲一一在线 | 欧美亚洲综合久久 | 国产成人自拍视频在线观看 | av在线天堂 | 亚洲狠狠爱一区二区三区 | 自拍偷拍视频网站 | 欧美精品久久久 | 欧美中文字幕一区二区三区 | 日本一区二区精品视频 | 91视频 - 88av| 黄色av网站免费看 | 国产福利电影一区 | 亚洲三级视频 | 免费观看黄色 | 日韩码有限公司在线观看 | 久久丁香 | 欧美激情视频一区二区三区 | 秋霞电影院午夜伦 | 91麻豆精品国产91久久久资源速度 |