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

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

java面試常見模式問題---單例模式

瀏覽:120日期:2022-08-11 08:43:06
目錄1、簡介2、單例模式——懶漢式3、單例模式——餓漢式總結(jié)1、簡介

單例模式使⽤場景

業(yè)務(wù)系統(tǒng)全局只需要⼀個(gè)對象實(shí)例,⽐如發(fā)號(hào)器、 redis 連接對象等。 Spring IOC容器中的 Bean 默認(rèn)就是單例。 Spring Boot 中的 Controller、Service、Dao 層中通過 @Autowire的依賴注⼊對象默認(rèn)都是單例的。

單例模式分類

懶漢:就是所謂的懶加載,延遲創(chuàng)建對象,需要用的時(shí)候再創(chuàng)建對象。 餓漢:與懶漢相反,提前創(chuàng)建對象。 單例模式實(shí)現(xiàn)步驟: 私有化構(gòu)造函數(shù)提供獲取單例的方法。2、單例模式——懶漢式單例模式——懶漢式有以下⼏種實(shí)現(xiàn)⽅式:

/** * @Auther: csp1999 * @Date: 2020/11/06/20:36 * @Description: 單例設(shè)計(jì)模式-懶漢式 */public class SingletonLazy { // 當(dāng)需要用到該實(shí)例的時(shí)候再創(chuàng)建實(shí)例對象 private static SingletonLazy instance; /** * 構(gòu)造函數(shù)私有化 * 不能通過 new SingletonLazy() 的方式創(chuàng)建實(shí)例 * * 當(dāng)需要用到該實(shí)例的時(shí)候在加載 * 只能通過 SingletonLazy.getInstance() 這種方式獲取實(shí)例 */ private SingletonLazy() { } /** * 單例對象的方法 */ public void process() {System.out.println('方法實(shí)例化成功!'); } /** * 方式一: * <p> * 對外暴露一個(gè)方法獲取該類的對象 * <p> * 缺點(diǎn):線程不安全,多線程下存在安全問題 * * @return */ public static SingletonLazy getInstance() {if (instance == null) {// 實(shí)例為null時(shí)候才創(chuàng)建 /** * 線程安全問題: * 當(dāng)某一時(shí)刻,兩個(gè)或多個(gè)線程同時(shí)判斷到instance == null成立的時(shí)候 * 這些線程同時(shí)進(jìn)入該if判斷內(nèi)部執(zhí)行實(shí)例化 * 則會(huì)新建出不止一個(gè)SingletonLazy實(shí)例 */ instance = new SingletonLazy();// 當(dāng)需要的時(shí)候再進(jìn)行實(shí)例化對象}return instance; } /** * 方式二: * 通過加synchronized鎖 保證線程安全 * * 采用synchronized 對方法加鎖有很大的性能開銷 * 因?yàn)楫?dāng)getInstance2()內(nèi)部邏輯比較復(fù)雜的時(shí)候,在高并發(fā)條件下 * 沒獲取到加鎖方法執(zhí)行權(quán)的線程,都得等到這個(gè)方法內(nèi)的復(fù)雜邏輯執(zhí)行完后才能執(zhí)行,等待浪費(fèi)時(shí)間,效率比較低 * * @return */ public static synchronized SingletonLazy getInstance2() {if (instance == null) {// 實(shí)例為null時(shí)候才創(chuàng)建 // 方法上加synchronized鎖后可以保證線程安全 instance = new SingletonLazy();// 當(dāng)需要的時(shí)候再進(jìn)行實(shí)例化對象}return instance; } /** * 方式三: * 在getInstance3()方法內(nèi),針對局部需要加鎖的代碼塊加鎖,而不是給整個(gè)方法加鎖 * * 也存在缺陷: * @return */ public static SingletonLazy getInstance3() {if (instance == null) {// 實(shí)例為null時(shí)候才創(chuàng)建 // 局部加鎖后可以保證線程安全,效率較高 // 缺陷:假設(shè)線程A和線程B synchronized (SingletonLazy.class){// 當(dāng)線程A獲得鎖的執(zhí)行權(quán)的時(shí)候B等待 A執(zhí)行new SingletonLazy();實(shí)例化// 當(dāng)A線程執(zhí)行完畢后,B再獲得執(zhí)行權(quán),這時(shí)候還是可以實(shí)例化該對象instance = new SingletonLazy();// 當(dāng)需要的時(shí)候再進(jìn)行實(shí)例化對象 }}return instance; }}單例模式:懶漢實(shí)現(xiàn) + 雙重檢查鎖定 + 內(nèi)存模型

對于上面方式三存在的缺陷,我們可以使用雙重檢查鎖定的方式對其進(jìn)行改進(jìn)

/** * 方式三改進(jìn)版本: * 在getInstance3()方法內(nèi),針對局部需要加鎖的代碼塊加鎖,而不是給整個(gè)方法加鎖 * * DCL 雙重檢查鎖定 (Double-Checked-Locking) 在多線程情況下保持高性能 * * 這是否安全? instance = new SingletonLazy(); 并不是原子性操作 * jvm中 instance實(shí)例化內(nèi)存模型流程如下: * 1.分配空間給對象 * 2.在空間內(nèi)創(chuàng)建對象 * 3.將對象賦值給instance引用 * * 假如出現(xiàn)如下順序錯(cuò)亂的情況: * 線程的執(zhí)行順序?yàn)椋? -> 3 -> 2, 那么這時(shí)候會(huì)把值寫回主內(nèi)存 * 則,其他線程就會(huì)讀取到instance的最新值,但是這個(gè)是不完全的對象 * (指令重排現(xiàn)象) * * @return */public static SingletonLazy getInstance3plus() { if (instance == null) {// 實(shí)例為null時(shí)候才創(chuàng)建// 局部加鎖后可以保證線程安全,效率較高// 假設(shè)線程A和線程B synchronized (SingletonLazy.class){// 第一重檢查 // 當(dāng)線程A獲得鎖的執(zhí)行權(quán)的時(shí)候B等待 A執(zhí)行new SingletonLazy();實(shí)例化 // 當(dāng)A線程執(zhí)行完畢后,B再獲得執(zhí)行權(quán),這時(shí)候再判斷instance == null是否成立 // 如果不成立,B線程無法 實(shí)例化SingletonLazy if (instance == null){// 第二重檢查instance = new SingletonLazy();// 當(dāng)需要的時(shí)候再進(jìn)行實(shí)例化對象 }} } return instance;}

再次升級(jí)方式三,來解決內(nèi)存模型中的指令重排問題

// 添加volatile 關(guān)鍵字,禁止實(shí)例化對象時(shí),內(nèi)存模型中出現(xiàn)指令重排現(xiàn)象private static volatile SingletonLazy instance;/** * 方式三再次升級(jí)版本: * 在getInstance3()方法內(nèi),針對局部需要加鎖的代碼塊加鎖,而不是給整個(gè)方法加鎖 * * DCL 雙重檢查鎖定 (Double-Checked-Locking) 在多線程情況下保持高性能 * * 解決指令重排問題——禁止指令重排 * @return */public static SingletonLazy getInstance3plusplus() { if (instance == null) {// 實(shí)例為null時(shí)候才創(chuàng)建// 局部加鎖后可以保證線程安全,效率較高// 假設(shè)線程A和線程Bsynchronized (SingletonLazy.class){// 第一重檢查 // 當(dāng)線程A獲得鎖的執(zhí)行權(quán)的時(shí)候B等待 A執(zhí)行new SingletonLazy();實(shí)例化 // 當(dāng)A線程執(zhí)行完畢后,B再獲得執(zhí)行權(quán),這時(shí)候再判斷instance == null是否成立 // 如果不成立,B線程無法 實(shí)例化SingletonLazy if (instance == null){// 第二重檢查instance = new SingletonLazy();// 當(dāng)需要的時(shí)候再進(jìn)行實(shí)例化對象 }} } return instance;}

單例模式——懶漢式調(diào)用:

@Testpublic void testSingletonLazy(){ SingletonLazy.getInstance().process();}3、單例模式——餓漢式

/** * @Auther: csp1999 * @Date: 2020/11/06/21:39 * @Description: 單例設(shè)計(jì)模式-餓漢式 */public class SingletonHungry { // 當(dāng)類加載的時(shí)候就直接實(shí)例化對象 private static SingletonHungry instance = new SingletonHungry(); private SingletonHungry(){} /** * 單例對象的方法 */ public void process() {System.out.println('方法實(shí)例化成功!'); } public static SingletonHungry getInstance(){return instance;// 當(dāng)類加載的時(shí)候就直接實(shí)例化對象 }}單例模式——餓漢式調(diào)用:

@Testpublic void testSingletonHungry(){ SingletonHungry.getInstance().process();}

餓漢式單例模式,當(dāng)類加載的時(shí)候就直接實(shí)例化對象,因此不需要考慮線程安全問題。

優(yōu)點(diǎn):實(shí)現(xiàn)簡單,不需要考慮線程安全問題。 缺點(diǎn):不管有沒有使用該對象實(shí)例,instance對象一直占用著這段內(nèi)存。

懶漢與餓漢式如何選擇?

如果對象內(nèi)存占用不大,且創(chuàng)建不復(fù)雜,直接使用餓漢的方式即可。 其他情況均采用懶漢方式(優(yōu)選)。總結(jié)

文章會(huì)不定時(shí)更新,有時(shí)候一天多更新幾篇,如果幫助您復(fù)習(xí)鞏固了知識(shí)點(diǎn),還請支持一下,后續(xù)會(huì)億點(diǎn)點(diǎn)的更新!希望大家多多關(guān)注好吧啦網(wǎng)的其他內(nèi)容!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久亚洲精品中文字幕| 国产精品v一区二区三区| av日韩中文| 久久精品72免费观看| 先锋影音久久久| 欧美性感美女一区二区| 乱一区二区av| 欧美亚洲国产日韩| 好吊视频一区二区三区四区| 国产理论在线| 国产福利一区二区精品秒拍 | 国产一区二区亚洲| 欧美日本一区| 麻豆视频久久| 国产精品亚洲欧美日韩一区在线| 久久久亚洲欧洲日产| 成人一区不卡| 国产精品久久久久久久久免费高清| 亚洲涩涩av| 欧美色图一区| 精品视频自拍| 免费看久久久| 麻豆国产91在线播放| 国产精品伦一区二区| 青草久久视频| 国产精品久久久久久模特| 国产精品一区亚洲| 日韩国产在线观看| 日韩av午夜在线观看| 亚洲97av| 天堂av在线一区| 久久xxxx精品视频| 中文字幕亚洲在线观看| 日韩亚洲精品在线观看| 男人的天堂久久精品| 欧美专区18| 视频国产精品| 国产日韩在线观看视频| 久久久久九九精品影院| а√天堂中文在线资源8| 亚洲电影有码| 亚洲精品1区2区| 亚洲区欧美区| 国产精品永久| 中文在线免费视频| 欧美亚洲国产一区| 免费成人在线影院| 啪啪亚洲精品| 精品国产亚洲日本| 日本久久黄色| av在线日韩| 亚洲精品中文字幕乱码| 蜜臀久久99精品久久久画质超高清| 婷婷色综合网| 亚洲精选91| 国产精品亚洲成在人线| 日韩综合在线| 欧美亚洲国产激情| 蜜臀91精品一区二区三区| 日本三级亚洲精品| 国产精品色在线网站| 国产夫妻在线| 亚洲精品在线观看91| 亚洲精品进入| 国产精品久久久久77777丨| 欧美好骚综合网| 亚洲精品99| 日本视频在线一区| 国产96在线亚洲| 激情婷婷综合| 日韩精彩视频在线观看| 精品久久久久久久| 免费视频一区三区| 首页国产欧美久久| 国产高清视频一区二区| 国产一区二区三区免费在线| 亚洲精品一级二级三级| 精品久久久网| 9色国产精品| 日韩av一区二区三区四区| 国产精品午夜av| 精品国产美女a久久9999| 日韩中出av| 亚洲精品中文字幕乱码| 91一区二区三区四区| 91国内精品| 视频一区二区不卡| 欧美日韩一二三四| 亚洲国产欧美日本视频| 国产精品videosex极品| 亚洲狼人精品一区二区三区| 久久国产直播| av资源新版天堂在线| 国产亚洲精品美女久久久久久久久久| 日韩精品欧美激情一区二区| 另类欧美日韩国产在线| 国产精品综合| 日韩三级一区| 亚洲欧美激情诱惑| 久久久久国产| 成人亚洲精品| 国产精品视频一区视频二区| 午夜精品影视国产一区在线麻豆| 亚洲手机在线| 韩国精品主播一区二区在线观看 | 最近国产精品视频| 91精品福利| 精品捆绑调教一区二区三区 | 久久九九精品| 亚洲成a人片| 日韩三区免费| 久久精品主播| 日本久久成人网| 日韩精品欧美激情一区二区| 最新中文字幕在线播放| 久久亚洲黄色| 国产福利一区二区精品秒拍 | 欧美性感美女一区二区| 久久久精品久久久久久96| 日韩中文影院| 五月天av在线| 久久国产中文字幕| 久久国产日韩| 日本在线精品| 激情综合网址| 欧美日韩精品一本二本三本| 亚洲欧洲另类| 中文视频一区| 日韩精品成人| 国产精品亲子伦av一区二区三区 | 四虎国产精品免费久久| 亚洲精品国产精品粉嫩| 日本不卡一二三区黄网| 日日夜夜免费精品| 国产欧美日韩一区二区三区四区 | 在线综合亚洲| 婷婷久久一区| 亚洲欧洲一区| 免费观看久久久4p| 日韩精品a在线观看91| 欧美日韩亚洲国产精品| 久久只有精品| 成人久久久久| 国产精品毛片在线看| 亚洲毛片在线| 麻豆一区二区三| 韩国久久久久久| 久久婷婷亚洲| 蜜桃视频一区二区三区| 欧美日一区二区三区在线观看国产免| 国产欧美日韩精品一区二区三区| 精品一区二区男人吃奶 | 精品视频91| 欧美日韩在线二区| 石原莉奈一区二区三区在线观看| 奇米777国产一区国产二区| 免费看久久久| 韩国三级一区| 一区二区电影在线观看| 久久国内精品视频| 久久不卡日韩美女| 色偷偷偷在线视频播放| 日韩视频一区| 日韩av中文字幕一区二区 | 91亚洲精品在看在线观看高清| 国产精品白丝一区二区三区| 高清不卡亚洲| 蜜臀va亚洲va欧美va天堂| 国产剧情一区| 久久精品在线| 日韩精品欧美成人高清一区二区| 久久只有精品| 黑丝美女一区二区| 日韩激情一区二区| 色婷婷综合网| 鲁大师成人一区二区三区| 日韩视频1区| 久久香蕉网站| 国产一区观看| 青青草国产精品亚洲专区无| 激情国产在线| 伊人久久亚洲| 成人三级高清视频在线看| 午夜亚洲精品| 国产极品一区| 狠狠干综合网| 欧美韩一区二区| 欧美女激情福利| 美女毛片一区二区三区四区最新中文字幕亚洲 | 欧美日韩中文一区二区| 亚洲精品自拍| 久久激情网站| 国产欧美日韩一区二区三区在线| 亚洲高清av| 日韩av三区| 欧美日韩国产在线观看网站 | 欧美综合国产| 高清av一区| 欧美日韩伊人| 国产资源在线观看入口av|