成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:42日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩情趣电影| 亚洲另类一区二区| 中文字幕在线不卡| 高清国产一区二区| 91成人在线观看喷潮| 亚洲综合一区二区精品导航| 北条麻妃一区二区三区| 制服丝袜一区二区三区| 日韩精品视频网| 99日韩精品| 国产精品三级视频| 欧美黄污视频| 精品国产免费久久| 久久av中文字幕片| 色综合久久九月婷婷色综合| 亚洲制服丝袜av| 国产一区二区高清| 亚洲啪啪综合av一区二区三区| 午夜久久tv| 国产日本亚洲高清| 欧美精品一级| 欧美激情艳妇裸体舞| 亚洲欧美影院| 国产婷婷精品av在线| 99久久综合色| 日韩欧美国产综合一区| 高清不卡在线观看av| 91精品在线观看入口| 国产精品一二三| 日韩欧美一卡二卡| 国产精品一区二区男女羞羞无遮挡| 欧美综合天天夜夜久久| 免费在线看成人av| 欧美日韩国产区一| 国产一区二区三区综合| 日韩欧美一级在线播放| 99精品视频中文字幕| 久久久国产精华| 欧美成人有码| 国产精品人成在线观看免费| 欧美三级网页| 中文字幕一区二区三区在线播放 | |精品福利一区二区三区| 激情婷婷亚洲| 亚洲精品伦理在线| 国产女主播一区二区| 日韩国产欧美在线视频| 欧美精品丝袜中出| 国产成人精品影视| 久久亚洲精华国产精华液| 欧美精品aa| 一区二区三区日本| 欧美综合亚洲图片综合区| 国产成人av资源| 日韩精品一区国产麻豆| 欧美成熟视频| 亚洲激情图片小说视频| 久久久99国产精品免费| 久久99日本精品| 日韩免费观看高清完整版 | 亚洲成人激情自拍| 欧美日韩三级在线| 99久久国产综合色|国产精品| 国产欧美一区二区精品秋霞影院| 欧美日韩亚洲一区二区三区四区| 一区二区三区在线观看动漫| 狼狼综合久久久久综合网| 免费在线看成人av| 精品国产乱码久久久久久老虎| k8久久久一区二区三区| 99热在线精品观看| 九一九一国产精品| 精品国产免费一区二区三区香蕉| 亚洲另类视频| 国产在线一区二区综合免费视频| 精品三级av在线| 亚洲人体一区| 久久成人综合网| 国产丝袜美腿一区二区三区| 国产欧美大片| 国产精品一区二区你懂的| 中文字幕国产精品一区二区| 亚洲在线播放电影| 精品一区二区三区欧美| 国产三级精品视频| 久久精品1区| 成人性视频免费网站| 亚洲免费三区一区二区| 欧美狂野另类xxxxoooo| 国内精品久久久久久久97牛牛| 日本不卡一二三区黄网| 久久久久免费观看| 久久午夜激情| 97久久精品人人做人人爽50路 | 人人超碰91尤物精品国产| 日韩午夜激情av| 99国产精品| 国产福利精品一区二区| 亚洲免费观看高清完整版在线观看熊| 欧美日韩中文一区| 亚洲午夜伦理| 国产麻豆一精品一av一免费| 日韩毛片精品高清免费| 91精品国产色综合久久| 亚洲美女色禁图| 国产高清成人在线| 亚洲综合偷拍欧美一区色| 日韩一区二区三区免费看| 国产亚洲毛片在线| 成人午夜碰碰视频| 一区二区三区**美女毛片| 日韩欧美亚洲国产精品字幕久久久| 99国产精品私拍| 成人手机电影网| 日韩精品电影在线观看| 欧美国产成人精品| 欧美精三区欧美精三区| 亚洲麻豆av| 99v久久综合狠狠综合久久| 蜜臀av性久久久久av蜜臀妖精 | 在线视频综合导航| 国产自产在线视频一区| 精品一区二区三区的国产在线播放| 国产精品久久久久aaaa樱花| 91精品国产综合久久久久久久| av成人黄色| av男人天堂一区| 老汉av免费一区二区三区 | 亚洲三级在线看| 色狠狠av一区二区三区| 亚洲国产一区二区在线| 国产成人免费xxxxxxxx| 视频一区免费在线观看| 亚洲欧美怡红院| 欧美成人三级在线| 欧美亚日韩国产aⅴ精品中极品| 韩日视频一区| zzijzzij亚洲日本少妇熟睡| 看电影不卡的网站| 亚洲一二三四在线观看| 国产精品色婷婷久久58| 精品国免费一区二区三区| 欧美亚洲国产一区在线观看网站| 国产欧美日韩在线播放| 欧美日韩天天操| 成人看片黄a免费看在线| 久久99国产精品久久99果冻传媒| 亚洲国产美女搞黄色| 国产精品区一区二区三区 | 亚洲自拍另类综合| 国产精品视频你懂的| 久久无码av三级| 日韩午夜激情免费电影| 欧美日韩国产大片| 欧美综合亚洲图片综合区| 先锋影音久久久| 91久久精品国产91久久性色tv | 欧美伊人久久大香线蕉综合69 | 91成人国产精品| 久久免费黄色| 国产三区二区一区久久| 欧美日韩影院| 91浏览器打开| 日本vs亚洲vs韩国一区三区二区| 亚洲国产综合人成综合网站| 亚洲婷婷综合久久一本伊一区| 久久精品免视看| 精品少妇一区二区三区免费观看 | 激情欧美一区二区| 美女脱光内衣内裤视频久久网站| 亚洲成av人片观看| 一区二区三区在线免费播放 | 国产精品一区二区三区网站| 国产在线精品一区二区夜色| 久久国产生活片100| 美女被吸乳得到大胸91| 奇米综合一区二区三区精品视频| 亚洲大片在线观看| 一级中文字幕一区二区| 亚洲色图视频网| 中文字幕亚洲一区二区av在线| 国产精品视频一二三区| 国产精品免费视频观看| 国产精品九色蝌蚪自拍| 国产精品麻豆久久久| 国产精品免费人成网站| 国产精品成人免费| 亚洲图片你懂的| 亚洲激情男女视频| 亚洲一线二线三线视频| 亚洲宅男天堂在线观看无病毒| 亚洲国产精品影院| 调教+趴+乳夹+国产+精品| 奇米色777欧美一区二区| 九一九一国产精品| 国产成人鲁色资源国产91色综 | 亚洲一级电影视频| 琪琪久久久久日韩精品| 紧缚奴在线一区二区三区| 国产毛片精品视频|