1. 程式人生 > >DoubleCheck的幾種方法總結

DoubleCheck的幾種方法總結

第一種:非延遲載入單例類

public class Singleton {  
 private Singleton() {}  
 private static final Singleton instance = new Singleton();  
 public static Singleton getInstance() {  
  return instance;  
 }  
}  

第二種:同步延遲載入

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

第三種:雙重檢測同步延遲載入 
為處理原版非延遲載入方式瓶頸問題,我們需要對 instance 進行第二次檢查,目的是避開過多的同步(因為這裡的同步只需在第一次建立例項時才同步,一旦建立成功,以後獲取例項時就不需要同獲取鎖了),instance為volatile則可行:

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

這裡是主要是要理解為什麼要使用volatile修飾變數才行,是因為:

volatile變數規則:對一個變數的寫操作先行發生於後面對這個變數的讀操作,所以才不會出現物件還在建立就被其他執行緒拿去使用的情況,其他執行緒都會得到一個建立好的物件

第四種:使用內部類實現延遲載入

public class Singleton {  
 private Singleton() {}  
 private static class Holder {  
 
  private static Singleton instance = new Singleton();  
 }  
 public static Singleton getInstance() {  
  // 外圍類能直接訪問內部類(不管是否是靜態的)的私有變數  
  return Holder.instance;  
 }  
}  

相關推薦

DoubleCheck方法總結

第一種:非延遲載入單例類 public class Singleton { private Singleton() {} private static final Singleton instance = new Singleton(); public s

JS刷新當前頁面的方法總結

onu navigate mman reload 存在 .exe time 通過 復制代碼 reload 方法,該方法強迫瀏覽器刷新當前頁面。語法:location.reload([bForceGet])

laravel安裝的方法總結

php laravel 安裝 Laravel安裝方法大的來分可以分為利用Composer安裝和一鍵安裝包安裝。先來說一下最簡單的安裝方式,利用一鍵安裝包來安裝Laravel。為了方便初學者學習Laravel有大神在網上提供了一鍵安裝包(下載網址:http://www.golaravel.com/d

優化MySQL性能的方法-總結

big 計算 保持 失敗 優化mysql sql one div 另一個 原文:http://bbs.landingbj.com/t-0-245601-1.html 1、要選取最適用的字段屬性 MySQL可以很好的支持大數據量的存取,但是一般說來,數據庫中的表越

生成下拉框的方法總結——數據來源:枚舉

ati state 數據集 equal type() tty each 其中 sele 上節介紹數據來源是數據庫,這節介紹對枚舉進行數據獲取,形成下拉列表。 使用場景:某些狀態值獲取等,一般是數據量小,不需要在數據庫中進行維護的數據集 1、前提要有枚舉數據

js 刪除陣列中某一項的方法總結

第一種:改變原陣列 借用原生陣列方法:splice(index,len,[item])  剪接 借用原生物件方法:delete array[index] + array.slice(0, index).concat(array.slice(index, array.length-1))

防止表單重複提交的方法總結

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Warpar/article/details/72917924 1、JavaScript防止表單重複提交(主要用於網路延遲情況下使用者點選多次submit按鈕導致表單重複提

C++中函式返回陣列指標的方法總結

因為陣列不能被拷貝,所以函式不能返回陣列。不過,函式可以返回陣列的指標或引用。返回陣列指標的方法有以下幾種:     1、方法一:使用類型別名。如下         typedef int arrt[10];//arrT是一個類型別名,它表示的型別是含有10個整數的陣列   

資料庫sql優化的方法總結

在sql查詢中為了提高查詢效率,我們常常會採取一些措施對查詢語句進行sql優化,下面總結的一些方法,有需要的可以參考參考。 1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 wher

[組合數]求組合數的方法總結

求C(n,m)%mod的方法總結 1.當n,m都很小的時候可以利用楊輝三角直接求。 C(n,m)=C(n-1,m)+C(n-1,m-1); 2.利用乘法逆元。 乘法逆元:(a/b)%mod=a*(b^(mod-2)) mod為素數。 逆元可以利用擴

微信小程式 傳值取值的方法總結,百分百會用到

微信小程式 傳值取值 小程式裡常見的取值有以下幾種,一個完整的專案寫下來,用到的概率幾乎是100%。 列表index下標取值 頁面傳值 form表單取值 列表index下標取值 實現方式是:data-index=”{{index}}”挖坑及e.cu

Java中遍歷Map的方法總結

方法一 在for-each迴圈中使用entries來遍歷 這是最常見的並且在大多數情況下也是最可取的遍歷方式。在鍵值都需要時使用。 Map<Integer, Integer> map = new HashMap<Integer, Integer>

Servlet跳轉頁面的方法總結

servlet跳轉頁面的方法: 跳轉分為兩部分,一部分發生在servlet,另一部分發生在JSP,JSP就是servlet,但是兩者還是有部分差異。 Servlet:(跳轉發生在doGet,doPost等方法裡) (1)redirect方式

關於圖片拉伸的方法總結

系統至ios6之後,關於圖片拉伸的方法已經擴充套件至3個函式: 1.ios4提供的方法: - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInt

Linux執行緒同步機制的方法總結與對比

執行緒同步機制的幾種方法總結與對比 需要執行緒同步的原因: 當有多個執行緒同時訪問一個共享記憶體裡面的變數時,有時會出現一個執行緒正在修改該變數的值,而其他的執行緒正在讀取資料,可能就會導致錯誤。

python獲取命令列引數的方法總結

第一種是利用sys.argv模組 import sys print sys.argv 輸出整個命令列,以list的格式,所以有時候可以通過判斷這個list的長度來判斷是否有引數值輸入。 print sys.argv[0] print sys.argv[1] prin

php頁面傳遞引數值方法總結

又搞了一個學期的php,就這樣吧。      php是一種伺服器的指令碼語言,他也是現在最為流行的WEB開發語言,下面我們來講述一下幾種上在php開發應用中常用的四種頁面之間傳遞引數的幾種方法。    第一種:使用客戶端瀏覽器的cookie。cookie很容易理解,就是一個臨時檔案,可以把它看成一個儲藏室,瀏

Android截圖截圖的方法總結

Android截圖   Android截圖的原理:獲取具體需要截圖的區域的Bitmap,然後繪製在畫布上,儲存為圖片後進行分享或者其它用途 一、Activity截圖 1、截Activity介面(包含空白的狀態列) ? 1 2 3 4

python寫入csv檔案的方法總結

最常用的一種方法,利用pandas包import pandas as pd #任意的多組列表 a = [1,2,3] b = [4,5,6] #字典中的key值即為csv中列名 dataframe = pd.DataFrame({'a_name':a,'b_nam

Qt常見設定背景圖片的方法總結

     常用的設定背景的方式有三種: 1、利用style sheet給窗體設定背景。 2、利用Qt UI設計器的改變樣式表進行設定。如下: 3、通過如下程式碼來實現。 QPixmap pixmap