亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JAVA多線程并發下的單例模式應用

2020-01-31 16:50:19
字體:
來源:轉載
供稿:網友

單例模式應該是設計模式中比較簡單的一個,也是非常常見的,但是在多線程并發的環境下使用卻是不那么簡單了,今天給大家分享一個我在開發過程中遇到的單例模式的應用。

首先我們先來看一下單例模式的定義:

一個類有且僅有一個實例,并且自行實例化向整個系統提供。
單例模式的要素:
1.私有的靜態的實例對象
2.私有的構造函數(保證在該類外部,無法通過new的方式來創建對象實例)
3.公有的、靜態的、訪問該實例對象的方法

單例模式分為懶漢形和餓漢式

懶漢式:

應用剛啟動的時候,并不創建實例,當外部調用該類的實例或者該類實例方法的時候,才創建該類的實例。(時間換空間)

優點:實例在被使用的時候才被創建,可以節省系統資源,體現了延遲加載的思想。

缺點:由于系統剛啟動時且未被外部調用時,實例沒有創建;如果一時間有多個線程同時調用LazySingleton.getLazyInstance()方法很有可能會產生多個實例。

例子:

publicclassSingletonClass{ //私有構造函數,保證類不能通過new創建privateSingletonClass(){}privatestaticSingletonClassinstance=null; publicstaticSingletonClassgetInstance(){if(instance==null){ //創建本類對象 instance=newSingletonClass();}returninstance;} }

餓漢式

應用剛啟動的時候,不管外部有沒有調用該類的實例方法,該類的實例就已經創建好了。(空間換時間。)

優點:寫法簡單,在多線程下也能保證單例實例的唯一性,不用同步,運行效率高。

缺點:在外部沒有使用到該類的時候,該類的實例就創建了,若該類實例的創建比較消耗系統資源,并且外部一直沒有調用該實例,那么這部分的系統資源的消耗是沒有意義的。

例子:

publicclassSingleton{//首先自己在內部定義自己的一個實例,只供內部調用privatestaticfinalSingletoninstance=newSingleton();//私有構造函數 privateSingleton(){}//提供了靜態方法,外部可以直接調用publicstaticSingletongetInstance(){returninstance;}}下面模擬單例模式在多線程下會出現的問題/***懶漢式單例類*/publicclassLazySingleton{//為了易于模擬多線程下,懶漢式出現的問題,我們在創建實例的構造函數里面使當前線程暫停了50毫秒privateLazySingleton(){try{Thread.sleep(50);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("生成LazySingleton實例一次!");}privatestaticLazySingletonlazyInstance=null;publicstaticLazySingletongetLazyInstance(){if(lazyInstance==null){lazyInstance=newLazySingleton();}returnlazyInstance;}}

測試代碼:我們在測試代碼里面新建了10個線程,讓這10個線程同時調用LazySingleton.getLazyInstance()方法

publicclassSingletonTest{publicstaticvoidmain(String[]args){ //創建十個線程調for(inti=0;i<10;i++){newThread(){@Overridepublicvoidrun(){LazySingleton.getLazyInstance();}}.start();}}}

結果:

生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!
生成LazySingleton實例一次!

可以看出單例模式懶漢式在多線程的并發下也會出現問題,

分析一下:多個線程同時訪問上面的懶漢式單例,現在有兩個線程A和B同時訪問LazySingleton.getLazyInstance()方法。
假設A先得到CPU的時間切片,A執行到if(lazyInstance==null)時,由于lazyInstance之前并沒有實例化,所以lazyInstance==null為true,在還沒有執行實例創建的時候

此時CPU將執行時間分給了線程B,線程B執行到if(lazyInstance==null)時,由于lazyInstance之前并沒有實例化,所以lazyInstance==null為true,線程B繼續往下執行實例的創建過程,線程B創建完實例之后,返回。

此時CPU將時間切片分給線程A,線程A接著開始執行實例的創建,實例創建完之后便返回。由此看線程A和線程B分別創建了一個實例(存在2個實例了),這就導致了單例的失效。

解決辦法:我們可以在getLazyInstance方法上加上synchronized使其同步,但是這樣一來,會降低整個訪問的速度,而且每次都要判斷。

那么有沒有更好的方式來實現呢?我們可以考慮使用"雙重檢查加鎖"的方式來實現,就可以既實現線程安全,又能夠使性能不受到很大的影響。我們看看具體解決代碼

publicclassLazySingleton{privateLazySingleton(){try{Thread.sleep(50);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("生成LazySingleton實例一次!");}privatestaticLazySingletonlazyInstance=null;publicstaticLazySingletongetLazyInstance(){ //先檢查實例是否存在,如果不存在才進入下面的同步塊if(lazyInstance==null){ //同步塊,線程安全地創建實例 synchronized(LazySingleton.class){ //再次檢查實例是否存在,如果不存在才真正地創建實例 if(lazyInstance==null){  lazyInstance=newLazySingleton();  } }}returnlazyInstance;}}

這樣我們就可以在多線程并發下安全應用單例模式中的懶漢模式。這種方法在代碼上可能就不怎么美觀,我們可以優雅的使用一個內部類來維護單例類的實例,下面看看代碼

publicclassGracefulSingleton{privateGracefulSingleton(){System.out.println("創建GracefulSingleton實例一次!");}//類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例沒有綁定關系,而且只有被調用到才會裝載,從而實現了延遲加載privatestaticclassSingletonHoder{    //靜態初始化器,由JVM來保證線程安全privatestaticGracefulSingletoninstance=newGracefulSingleton();}publicstaticGracefulSingletongetInstance(){returnSingletonHoder.instance;}}

說一下我在實際開發中的場景:為了程序的高效率使用多線程并發,然而是循環調用,可能導致創建線程數過多,考慮采用線程池管理,這時候創建線程池仍然是處于循環調用中,也可能導致多個線程池,這時候就考慮使用單例模式。

源代碼:

publicclassThreadPoolFactoryUtil{privateExecutorServiceexecutorService; //在構造函數中創建線程池privateThreadPoolFactoryUtil(){//獲取系統處理器個數,作為線程池數量intnThreads=Runtime.getRuntime().availableProcessors();executorService=Executors.newFixedThreadPool(nThreads);}//定義一個靜態內部類,內部定義靜態成員創建外部類實例privatestaticclassSingletonContainer{privatestaticThreadPoolFactoryUtilutil=newThreadPoolFactoryUtil();}//獲取本類對象publicstaticThreadPoolFactoryUtilgetUtil(){returnSingletonContainer.util;}publicExecutorServicegetExecutorService(){returnexecutorService;}}

涉及到一個靜態內部類,我們看看靜態內部類的特點:

1、靜態內部類無需依賴于外部類,它可以獨立于外部對象而存在。
2、靜態內部類,多個外部類的對象可以共享同一個內部類的對象。
3、使用靜態內部類的好處是加強了代碼的封裝性以及提高了代碼的可讀性。
4、普通內部類不能聲明static的方法和變量,注意這里說的是變量,常量(也就是finalstatic修飾的屬性)還是可以的,而靜態內部類形似外部類,沒有任何限制。可以直接被用外部類名+內部類名獲得。

以上是我在實際開發中遇到的一些問題,部分摘自網上代碼,結合實開發際案例。如有不妥,希望大家及時指出!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美疯狂性受xxxxx另类| 中文字幕在线成人| 欧美性猛交丰臀xxxxx网站| 国产一区二区日韩精品欧美精品| 精品日本高清在线播放| 久久久久久久久久久91| 成人性生交大片免费看视频直播| 中文字幕亚洲在线| 日韩av片免费在线观看| 国产成人精品av| 欧美在线视频网| 97超碰蝌蚪网人人做人人爽| 亚州av一区二区| 国产免费久久av| 亚洲黄一区二区| 国产精品久久久久久久午夜| 91免费高清视频| 日韩成人在线免费观看| 国产精品九九九| 久久亚洲国产精品成人av秋霞| 中文欧美在线视频| 一区二区三区国产视频| 亚洲毛片在线观看.| 国产视频综合在线| 亚洲欧美福利视频| 日韩av免费看网站| 亚洲91精品在线| 亚洲视频在线观看视频| 欧美日韩在线免费观看| 久久综合久久八八| 国产精品 欧美在线| 中文字幕亚洲无线码a| 91九色蝌蚪国产| 日韩高清中文字幕| 欧美乱大交xxxxx| 成人网址在线观看| www.99久久热国产日韩欧美.com| 久热精品视频在线免费观看| 欧洲s码亚洲m码精品一区| 亚洲精品免费一区二区三区| 亚洲国产福利在线| 国产一区二区视频在线观看| 欧美国产日韩在线| 欧美一区亚洲一区| 国产精品福利小视频| 4444欧美成人kkkk| 国产精品视频久久久| 97视频在线免费观看| 国产免费成人av| 亚洲www在线观看| 日本成人激情视频| 97超碰蝌蚪网人人做人人爽| 97香蕉超级碰碰久久免费的优势| 久久久亚洲国产天美传媒修理工| 91在线观看免费观看| 大胆欧美人体视频| 亚洲精品720p| 国内久久久精品| 亚洲国产日韩欧美在线99| 日韩欧美精品中文字幕| 日韩av三级在线观看| 欧美精品激情在线| 久99九色视频在线观看| 日韩一区二区欧美| 久久九九免费视频| 91免费看视频.| 国产999精品久久久影片官网| 精品香蕉在线观看视频一| 欧美电影免费在线观看| 久久久久久久久久久国产| 亚洲国产成人av在线| 日韩国产欧美精品在线| 国产精品免费一区| 亚洲国产另类久久精品| 久久久久久久久久久人体| 国产精欧美一区二区三区| 色七七影院综合| 久久久久久久激情视频| 欧美激情第一页xxx| 国产精品福利小视频| 欧美国产高跟鞋裸体秀xxxhd| 欧美精品一区在线播放| 精品高清美女精品国产区| 色综久久综合桃花网| 国产精品视频自在线| 国产精品一区久久久| 亚洲缚视频在线观看| 91福利视频在线观看| 国产小视频国产精品| 成人日韩在线电影| 欧美老少做受xxxx高潮| 国外成人在线视频| 欧美成年人视频网站欧美| 欧美日本亚洲视频| 亚洲精品视频在线观看视频| 69视频在线播放| 91精品一区二区| 亚洲图片欧美日产| 国产美女搞久久| 欧美激情综合色综合啪啪五月| 欧美综合一区第一页| 欧美一级淫片aaaaaaa视频| 69久久夜色精品国产7777| 欧美日韩国产91| 日韩在线免费视频观看| 欧美精品一区二区免费| 疯狂做受xxxx高潮欧美日本| 中文字幕亚洲天堂| 26uuu另类亚洲欧美日本老年| 久久亚洲精品成人| 亚洲va男人天堂| 国产精品视频99| 国产精品久久久久久久久久久久久| 亚洲日本欧美中文幕| 久热在线中文字幕色999舞| 亚洲欧美制服中文字幕| 亚洲自拍偷拍色图| 国产精品久久久久免费a∨大胸| 日韩成人黄色av| 国产综合在线视频| 欧美另类老女人| 亚洲男人的天堂网站| 成人在线精品视频| 91最新国产视频| 国产专区欧美专区| 欧美中文在线观看国产| 亚洲精品成人av| 色诱女教师一区二区三区| 青草成人免费视频| 久久久精品中文字幕| 91高清视频在线免费观看| 91免费看片在线| 国产精品男人爽免费视频1| 久久夜色精品国产欧美乱| 成人黄色片网站| 91色在线视频| 精品久久久在线观看| 日韩一区二区三区国产| 亚洲影院污污.| 疯狂蹂躏欧美一区二区精品| 日韩美女av在线免费观看| 九九精品在线观看| 欧美日韩亚洲精品一区二区三区| 成人精品久久久| 成人午夜小视频| 欧美成人小视频| 亚洲偷熟乱区亚洲香蕉av| 成人国产精品一区| 久久精品99久久久久久久久| 亚洲欧洲视频在线| 国产精品久久久久一区二区| 亚洲区一区二区| 91久久精品美女高潮| 欧美一区二区三区艳史| 欧美在线免费观看| 欧美日本啪啪无遮挡网站| 久久男人的天堂| 欧美激情亚洲国产| 亚洲影视九九影院在线观看| 亚洲偷欧美偷国内偷| 亚洲伦理中文字幕| 久久久久久com| 欧美亚洲一级片| 亚洲天堂av高清|