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

您的位置:首頁技術(shù)文章
文章詳情頁

Java Volatile應(yīng)用單例模式實現(xiàn)過程解析

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

單例模式

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

餓漢式

構(gòu)造器私有化 自行創(chuàng)建,并且用靜態(tài)變量保存static 向外提供這個實例 public 強(qiáng)調(diào)這是一個單例,用final

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

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

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

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

public enum Singleto{ INSTANCE}

第三種靜態(tài)代碼塊

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

懶漢式構(gòu)造器私有化

用一個靜態(tài)變量保存這個唯一實例

提供一個靜態(tài)方法,獲取這個實例

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 我是構(gòu)造方法SingletonDemo'); } public static SingletonDemo getInstance() { if(instance == null) { instance = new SingletonDemo(); } return instance; } public static void main(String[] args) { // 這里的 == 是比較內(nèi)存地址 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()); }}

最后輸出結(jié)果:

Java Volatile應(yīng)用單例模式實現(xiàn)過程解析

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

public class SingletonDemo { private static SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + 't 我是構(gòu)造方法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(); } }}

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

Java Volatile應(yīng)用單例模式實現(xiàn)過程解析

解決方法一

引入synchronized關(guān)鍵字

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

輸出結(jié)果:

Java Volatile應(yīng)用單例模式實現(xiàn)過程解析

我們能夠發(fā)現(xiàn),通過引入Synchronized關(guān)鍵字,能夠解決高并發(fā)環(huán)境下的單例模式問題

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

解決方法二

通過引入DCL Double Check Lock雙端檢鎖機(jī)制

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

最后輸出的結(jié)果為:

Java Volatile應(yīng)用單例模式實現(xiàn)過程解析

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

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

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

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

但是我們通過上面的三個步驟,能夠發(fā)現(xiàn),步驟2 和 步驟3之間不存在 數(shù)據(jù)依賴關(guān)系,而且無論重排前 還是重排后,程序的執(zhí)行結(jié)果在單線程中并沒有改變,因此這種重排優(yōu)化是允許的。

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

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

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

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

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

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

private static volatile SingletonDemo instance = null;

最終代碼

public class SingletonDemo { private static volatile SingletonDemo instance = null; private SingletonDemo () { System.out.println(Thread.currentThread().getName() + 't 我是構(gòu)造方法SingletonDemo'); } public static SingletonDemo getInstance() { if(instance == null) { // a 雙重檢查加鎖多線程情況下會出現(xiàn)某個線程雖然這里已經(jīng)為空,但是另外一個線程已經(jīng)執(zhí)行到d處 synchronized (SingletonDemo.class) //b { //c不加volitale關(guān)鍵字的話有可能會出現(xiàn)尚未完全初始化就獲取到的情況。原因是內(nèi)存模型允許無序?qū)懭雐f(instance == null) { // d 此時才開始初始化 instance = new SingletonDemo();} } } return instance; } public static void main(String[] args) {// // 這里的 == 是比較內(nèi)存地址// 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(); } }}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久中文字幕av| 国产成人久久| 欧美日韩91| 日韩精品国产精品| 亚洲精选av| 美国三级日本三级久久99| 日本高清不卡一区二区三区视频| 欧美激情三区| 青青青免费在线视频| 国产高清亚洲| 美女在线视频一区| 精品国产乱码久久久久久1区2匹 | 成人污污视频| 免费观看亚洲| 激情综合自拍| 日韩精选在线| 国产欧美三级| 日韩精品2区| 亚洲人成在线网站| 麻豆理论在线观看| 伊人久久成人| 蜜桃视频一区二区三区| 色狠狠一区二区三区| 国产精品毛片视频| 91亚洲国产高清| 99视频精品免费观看| 日韩有吗在线观看| a国产在线视频| 99视频精品免费观看| 青青国产91久久久久久| 亚洲女人av| 亚洲成人一区在线观看| 国产精品成人国产| 激情不卡一区二区三区视频在线| 在线观看视频免费一区二区三区| 激情久久五月| 中文字幕人成乱码在线观看| 国产日韩欧美一区二区三区| 99热国内精品| 国产精品久久久久蜜臀| 韩国女主播一区二区三区| 国产精品国码视频| 丁香婷婷久久| 亚洲精品极品少妇16p| 国产视频一区免费看| 日本不卡视频在线观看 | 免费不卡中文字幕在线| 精品视频在线一区二区在线| 欧美精品影院| 91成人精品在线| 亚洲精品免费观看| 美女精品在线| 四虎成人精品一区二区免费网站| 亚洲在线观看| 免费视频最近日韩| 亚洲欧美日韩高清在线| 日韩精品一区第一页| 日韩在线观看中文字幕| 欧美日本不卡高清| 美女在线视频一区| 国产69精品久久| 理论片午夜视频在线观看| 欧美激情另类| 亚洲福利久久| 亚洲九九精品| 国产麻豆精品| 色爱综合网欧美| 国产精品毛片一区二区在线看| а√在线中文在线新版| 亚洲精品在线影院| 国产精品成久久久久| 99成人在线视频| 亚洲精品观看| 精品久久影院| 激情五月色综合国产精品| 日韩激情综合| 欧洲精品一区二区三区| 亚洲一区激情| 国产一区三区在线播放| 99亚洲视频| 精品三级久久久| 日韩一级网站| 福利一区和二区| 亚洲资源网站| 99久久精品网站| 久久高清免费观看| 精品美女在线视频| 亚洲伊人精品酒店| 久久一区欧美| 日韩精品久久久久久久软件91| 日韩免费看片| 欧美激情综合| 深夜福利亚洲| 亚洲一级二级| 久久99偷拍| 蜜桃视频在线观看一区| 精品国模一区二区三区| 国产探花一区| 一本一道久久a久久| 激情亚洲影院在线观看| 久久亚洲不卡| 色婷婷狠狠五月综合天色拍| 精品一区二区三区亚洲 | 国产一区二区三区不卡视频网站 | 成人国产精品一区二区免费麻豆| 国产伊人精品| 国产传媒av在线| 国产伦精品一区二区三区在线播放| 国产农村妇女精品一二区| 欧美韩一区二区| 日韩手机在线| 日本亚洲最大的色成网站www| 亚洲少妇诱惑| 黄色亚洲大片免费在线观看| 久久精品国产99久久| 亚洲激情av| 国产一区导航| 亚洲综合二区| 丝瓜av网站精品一区二区| 西西人体一区二区| 亚洲图片久久| 亚洲精品三级| 人人精品久久| 麻豆一区在线| 九九色在线视频| 好看的av在线不卡观看| 午夜一级久久| 日韩精品免费一区二区夜夜嗨| 日韩中文字幕在线一区| 亚洲精品高潮| 国产亚洲高清一区| 你懂的国产精品永久在线| 欧美综合精品| 国产一区二区精品福利地址| 91精品91| 国产精品美女午夜爽爽| 日韩精品永久网址| 日韩中文字幕91| 精品福利久久久| 蜜臀av在线播放一区二区三区 | 日韩av不卡一区二区| yellow在线观看网址| 亚洲最新av| 欧美精品日日操| 国产日韩一区| 日韩欧美在线精品| 国产精品普通话对白| 亚洲欧美一级| 麻豆国产欧美日韩综合精品二区| 麻豆网站免费在线观看| 亚洲激情中文在线| 日本亚洲欧洲无免费码在线| 国产精品亚洲产品| 欧美色图国产精品| 日韩综合一区二区三区| 国内精品麻豆美女在线播放视频| 久久久久国产精品一区三寸| 三级欧美在线一区| 精品国产精品国产偷麻豆| 亚洲电影在线一区二区三区| 91欧美极品| 91欧美在线| 日本不卡在线视频| 色综合www| 国产精品亚洲欧美日韩一区在线| 久久精品国内一区二区三区水蜜桃| 蜜桃av一区二区| av高清一区| 久久一区国产| 日韩欧美美女在线观看| 超碰成人av| 日韩精品久久久久久| 国产模特精品视频久久久久| 美女高潮久久久| 亚洲精品乱码日韩| 九九综合在线| 国产精品久久777777毛茸茸| 久久亚洲国产精品一区二区| 日本一区二区高清不卡| 国产精品久久久久av蜜臀| 日本成人中文字幕| 久久夜色精品| 国产精品视区| 亚洲一区欧美二区| 免费视频一区三区| 久久中文字幕av| 精品亚洲美女网站| 欧美xxxx中国| 亚洲午夜天堂| 成人欧美一区二区三区的电影| 国产精品久一| 欧美日韩精品一区二区三区在线观看| 狠狠色综合网| 国产精品美女| 免费在线欧美视频| 蜜桃av一区| 日韩高清一区| 国产一卡不卡| 国产成人在线中文字幕| 日韩成人三级|