日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java Volatile應用單例模式實現過程解析

瀏覽:82日期:2022-08-21 15:29:08

單例模式

回顧一下,單線程下的單例模式代碼

餓漢式

構造器私有化 自行創建,并且用靜態變量保存static 向外提供這個實例 public 強調這是一個單例,用final

public class sington(){ public final static INSTANCE = new singleton(); private singleton(){}}

第二種:jdk1.5之后用枚舉類型

枚舉類型:表示該類型的對象是有限的幾個

我們可以限定為1個,就稱了單例

public enum Singleto{ INSTANCE}

第三種靜態代碼塊

public class Singleton{public final static INSTANCE;static{ INSTANCE = new Singleton();}private Singleton(){}}

懶漢式構造器私有化

用一個靜態變量保存這個唯一實例

提供一個靜態方法,獲取這個實例

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

public class SingletonDemo { private static SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + 't 我是構造方法SingletonDemo'); } public static SingletonDemo getInstance() { if(instance == null) { instance = new SingletonDemo(); } return instance; } public static void main(String[] args) { // 這里的 == 是比較內存地址 System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance()); System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance()); System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance()); System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance()); }}

最后輸出結果:

Java Volatile應用單例模式實現過程解析

但是在多線程的環境下,我們的單例模式是否還是同一個對象了

public class SingletonDemo { private static SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + 't 我是構造方法SingletonDemo'); } public static SingletonDemo getInstance() { if(instance == null) { instance = new SingletonDemo(); } return instance; } public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(() -> {SingletonDemo.getInstance(); }, String.valueOf(i)).start(); } }}

從下面的結果我們可以看出,我們通過SingletonDemo.getInstance() 獲取到的對象,并不是同一個,而是被下面幾個線程都進行了創建,那么在多線程環境下,單例模式如何保證呢?

Java Volatile應用單例模式實現過程解析

解決方法一

引入synchronized關鍵字

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

輸出結果:

Java Volatile應用單例模式實現過程解析

我們能夠發現,通過引入Synchronized關鍵字,能夠解決高并發環境下的單例模式問題

但是synchronized屬于重量級的同步機制,它只允許一個線程同時訪問獲取實例的方法,但是為了保證數據一致性,而減低了并發性,因此采用的比較少

解決方法二

通過引入DCL Double Check Lock雙端檢鎖機制

public static SingletonDemo getInstance() { if(instance == null) { // 同步代碼段的時候,進行檢測 synchronized (SingletonDemo.class) {if(instance == null) { instance = new SingletonDemo();} } } return instance; }

最后輸出的結果為:

Java Volatile應用單例模式實現過程解析

從輸出結果來看,確實能夠保證單例模式的正確性,但是上面的方法還是存在問題的

DCL(雙端檢鎖)機制不一定是線程安全的,原因是有指令重排的存在,加入volatile可以禁止指令重排

原因是在某一個線程執行到第一次檢測的時候,讀取到 instance 不為null,instance的引用對象可能沒有完成實例化。因為 instance = new SingletonDemo();可以分為以下三步進行完成:

memory = allocate(); // 1、分配對象內存空間 instance(memory); // 2、初始化對象 instance = memory; // 3、設置instance指向剛剛分配的內存地址,此時instance != null

但是我們通過上面的三個步驟,能夠發現,步驟2 和 步驟3之間不存在 數據依賴關系,而且無論重排前 還是重排后,程序的執行結果在單線程中并沒有改變,因此這種重排優化是允許的。

memory = allocate(); // 1、分配對象內存空間 instance = memory; // 3、設置instance指向剛剛分配的內存地址,此時instance != null,但是對象還沒有初始化完成 instance(memory); // 2、初始化對象

這樣就會造成什么問題呢?

也就是當我們執行到重排后的步驟2,試圖獲取instance的時候,會得到null,因為對象的初始化還沒有完成,而是在重排后的步驟3才完成,因此執行單例模式的代碼時候,就會重新在創建一個instance實例

指令重排只會保證串行語義的執行一致性(單線程),但并不會關系多線程間的語義一致性

所以當一條線程訪問instance不為null時,由于instance實例未必已初始化完成,這就造成了線程安全的問題

所以需要引入volatile,來保證出現指令重排的問題,從而保證單例模式的線程安全性

private static volatile SingletonDemo instance = null;

最終代碼

public class SingletonDemo { private static volatile SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + 't 我是構造方法SingletonDemo'); } public static SingletonDemo getInstance() { if(instance == null) { // a 雙重檢查加鎖多線程情況下會出現某個線程雖然這里已經為空,但是另外一個線程已經執行到d處 synchronized (SingletonDemo.class) //b { //c不加volitale關鍵字的話有可能會出現尚未完全初始化就獲取到的情況。原因是內存模型允許無序寫入if(instance == null) { // d 此時才開始初始化 instance = new SingletonDemo();} } } return instance; } public static void main(String[] args) {// // 這里的 == 是比較內存地址// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance());// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance());// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance());// System.out.println(SingletonDemo.getInstance() == SingletonDemo.getInstance()); for (int i = 0; i < 10; i++) { new Thread(() -> {SingletonDemo.getInstance(); }, String.valueOf(i)).start(); } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人精品亚洲线观看| 自拍自偷一区二区三区| 综合欧美亚洲| 免费人成黄页网站在线一区二区| 在线视频亚洲| 亚洲视频电影在线| 亚洲欧洲av| 午夜性色一区二区三区免费视频| 日本aⅴ亚洲精品中文乱码| 欧美一区激情| 精品视频免费| 另类中文字幕国产精品| 国产亚洲激情| 久久国产三级| 亚洲1234区| 视频一区二区三区中文字幕| 中文字幕一区二区av| 日韩国产精品久久久久久亚洲| 国产日韩欧美中文在线| av免费不卡国产观看| 精品欧美激情在线观看| 亚洲精品极品| 久久久久97| 成人日韩在线观看| 国产美女一区| 国产精品巨作av| 99久精品视频在线观看视频| 最新国产精品| 色黄视频在线观看| 亚洲一区二区三区无吗| 麻豆精品在线播放| 亚洲高清av| 国产调教精品| 午夜国产一区二区| 另类综合日韩欧美亚洲| 亚洲精品91| 欧美黑人巨大videos精品| 亚洲va在线| 亚洲网址在线观看| 色乱码一区二区三区网站| 午夜在线播放视频欧美| 精品日韩一区| 男女男精品网站| 国产一区二区三区成人欧美日韩在线观看| 欧美日韩免费观看一区=区三区| 欧美日韩亚洲一区三区| 四虎4545www国产精品| 日韩黄色在线观看| 日本欧美不卡| 国产精选久久| 丝袜美腿亚洲一区二区图片| 国产欧美一区二区三区精品酒店| 亚洲人成网站在线在线观看| 精品免费av在线| 日韩在线视频一区二区三区| 啪啪国产精品| 国产精品网在线观看| 老鸭窝毛片一区二区三区| 国产精品久久久久久久免费观看| 婷婷五月色综合香五月| 九一成人免费视频| 日韩免费福利视频| 久久精品资源| 国产图片一区| 综合亚洲色图| 亚洲综合精品| 欧美午夜精品一区二区三区电影| 国产精品尤物| 午夜视频一区二区在线观看| 国精品一区二区| 成人一区不卡| 久久精品日韩欧美| 国产欧美视频在线| 午夜电影一区| 亚洲精品乱码久久久久久蜜桃麻豆| 国产综合激情| 中文字幕在线视频网站| 欧美黄色一区| 国产精品主播| 国产美女视频一区二区| 中文字幕av一区二区三区人| 亚洲国产日韩欧美在线| 日韩精品一区二区三区免费观看| 成人午夜在线| 精品视频一区二区三区四区五区| 欧美日韩亚洲一区三区| 日韩在线成人| 亚洲精品一级二级三级| 日韩在线网址| 日本精品久久| 91成人在线| 欧美日韩亚洲一区二区三区在线| 日韩国产在线观看一区| 日韩激情网站| 欧美亚洲三级| 国产日韩1区| 国产精品香蕉| 国产精品对白| 国产高清亚洲| 精品视频91| 高清久久精品| 亚洲永久av| 免费成人网www| 亚洲欧洲一区二区天堂久久| 国产一区二区精品| 日本亚洲视频| 国产精品一区二区av日韩在线| 欧美激情福利| а√天堂8资源在线| 久久精品国语| 久久成人国产| 欧美日本不卡| 国产一区一一区高清不卡| 91av亚洲| 国产婷婷精品| 欧美亚洲三级| 国产传媒在线观看| 亚洲香蕉网站| 日韩在线观看一区二区| 97成人在线| 国产一区二区三区日韩精品| 成人久久一区| 日本亚州欧洲精品不卡| 精品一区91| 在线 亚洲欧美在线综合一区| 综合视频一区| 久久99蜜桃| 亚洲夜间福利| 亚洲理论在线| 麻豆91在线播放| 亚洲婷婷免费| 日韩avvvv在线播放| 四季av一区二区凹凸精品| 久久亚洲国产| 日本精品国产| 波多野结衣久久精品| 日韩一区精品字幕| 精品三级在线| 亚洲免费婷婷| 精品色999| 亚洲一区二区三区中文字幕在线观看| 国产精品手机在线播放| 日韩激情精品| 成人污污视频| 91日韩免费| 免费不卡中文字幕在线| 亚洲精品系列| 国产videos久久| 日韩在线一二三区| 久久精品国产网站| 自由日本语亚洲人高潮| 久久亚洲精精品中文字幕| 国产高清一区| 精品中文字幕一区二区三区四区| 亚洲欧美日韩国产综合精品二区| 久久中文字幕一区二区三区| 夜久久久久久| 九色porny丨国产首页在线| 亚洲综合中文| 日本一区二区高清不卡| 丝袜国产日韩另类美女| 日韩中文在线电影| 国产美女视频一区二区| 99亚洲视频| 最新中文字幕在线播放| 日韩av不卡一区二区| 欧美精品黄色| 日本不卡免费高清视频在线| 色婷婷成人网| 欧美精品一卡| 精品国产免费人成网站| 欧美综合社区国产| 男人的天堂久久精品| 日韩欧美一区二区三区免费看| 国产乱码精品一区二区三区四区| 99在线|亚洲一区二区| 日韩高清成人| 欧美日韩18| 蜜桃av一区二区| 中文字幕高清在线播放| 国产精品任我爽爆在线播放| 亚洲日本在线观看视频| 黄色成人精品网站| 久久激情婷婷| 激情久久99| 鲁大师精品99久久久| 日本午夜精品久久久久| 先锋影音久久久| 亚洲v在线看| 综合日韩av| 麻豆成全视频免费观看在线看| 麻豆精品少妇| 国产精品嫩模av在线| 日韩一区二区三区免费视频| 精品在线91| 久久精品国产亚洲夜色av网站| 蜜桃av.网站在线观看| av中文资源在线资源免费观看| 国产麻豆一区| 日韩精品亚洲专区|