### 單例設計模式之懶漢實現+雙重檢查鎖定+內存模型
###
一個簡簡單單的單例設計模式之懶漢,就會涉及到雙重檢查鎖定DCL以及指令重排帶來的安全隱患并且設計到了內存模式。
###
重點需要了解DCL、指令重排以及volatile關鍵字和new一個對象的整個過程
###
直接看下面的代碼,里面的注釋寫的非常詳細
###
~~~
package com.goldnecis.設計模式.單例模式.design;
//1、單例模式(懶漢模式)
//利用DCL(Double-Checked Locking)雙重檢查鎖定是一種用于多線程環境下延遲初始化的優化技術,再結合懶加載(Lazy Initialization)和單例模式(Singleton Pattern)實現了最終可滿足多線程環境下的單例模式
public class SingletonLazy {
//4.7、為什么要使用static?因為getInstance是static,至于getInstance為什么是static下面有講解,在static方法當中只能使用靜態成員變量和靜態方法,除非你實例化一個對象!所以instance也是static
//在4.6當中提到的new的時候在多線程環境下有可能會發生指令重排,所以我們使用volatile關鍵字來修飾 所以得重點了解volatile關鍵字的作用
//在Java中,使用volatile關鍵字來修飾變量可以實現多線程之間的數據共享。當一個變量被聲明為volatile時,它將具有以下特點:
//可見性:對一個volatile變量的寫操作會立即被其他線程可見,即保證了修改的值對其他線程是可見的。
//有序性:對于volatile變量的讀寫操作,編譯器和處理器都會進行相應的指令重排,保證了指令的執行順序。
//這里我們正是利用了volatile關鍵字可以防止指令重排的特性避免被實例化出多個對象
private static volatile SingletonLazy instance;
//2、構造方法私有化 防止在外部進行實例化 只能在單例類的內部實例化返回
private SingletonLazy(){}
//3、單例對象的方法 可理解為處理各種業務邏輯 供外界調用
public void process(){
System.out.println("我是單例設計模式");
}
//4、供外界調用生成單例對象的方法 只能是靜態方法 通過類名稱來調用 因為構造方法當中禁止外界實例化單例類
//4.4、有可能你會問為什么不對getInstance方法加synchronized呢?因為這樣鎖的粒度太大,并發場景下肯定影響性能,不如減小鎖的粒度控制到方法體內部的具體邏輯當中去
public static SingletonLazy getInstance(){
//4.1、第一重檢查 避免不必要的同步
if(instance == null){
//4.3、因為在多線程環境下A B 鎖定同時進來有可能會實例化多個對象,所以我們通過synchronized來實現線程同步以防止被實例化出來多個對象
synchronized (SingletonLazy.class){
//4.5、第二重檢查 再次判斷instance是否為空 確保只有一個線程實例化對象
if(instance == null){
//4.6、instance = new SingletonLazy(); 并不是原?性操作
// * ①、分配空間給對象
// * ②、在空間內創建對象
// * ③、將對象賦值給引?instance
// 假如線程 1-3-2順序(不要以為就是按照123的順序進行new實例化,jvm虛擬機在編譯的時候會進行指令重拍有可能是132),會把值寫會主內存,其他線程就會讀取到instance最新的值,但是這個是不完全的對象就會導致錯誤
// 我們該如何避免指令重拍呢?java當中new一個對象也有幾率發生指令重排!!!
// java已經為我們提供了完整的解決方案就是volatile關鍵字 去看4.7
instance = new SingletonLazy();
}
}
}
//4.2、如果已經存在則直接返回該單例實例對象
return instance;
}
}
~~~
- 設計模式六大原則
- 常見的三大設計模式分類
- 創建型模式之單例模式
- 單例模式之懶漢
- 單例模式之餓漢
- 單例模式之如何選擇懶漢餓漢
- 什么情況下使用單例模式
- 創建型模式之工廠模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 創建型模式之原型模式
- 創建型模式之建造者模式
- 結構型模式之適配器模式
- 接口的適配器模式
- 類的適配器模式
- 結構型模式之橋接模式
- 結構型模式之橋接模式和適配器模式的區別
- 結構型模式之裝飾器模式
- 結構型模式之代理模式
- 結構模式之外觀模式
- 結構模式之享元模式
- 行為模式之策略模式
- 行為模式之模板模式
- 行為模式之觀察者模式
- 行為模式之責任鏈模式
- 行為模式之命令模式
- 行為模式之迭代器模式
- 行為模式之備忘錄模式
- 行為模式之狀態模式