資源描述:
《JAVA中單例模式的幾種實現(xiàn)方式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、JAVA中單例模式的幾種實現(xiàn)方式1線程不安全的實現(xiàn)方法 首先介紹java中最基本的單例模式實現(xiàn)方式,我們可以在一些初級的java書中看到。這種實現(xiàn)方法不是線程安全的,所以在項目實踐中如果涉及到線程安全就不會使用這種方式。但是如果不需要保證線程安全,則這種方式還是不錯的,因為所需要的開銷比較小。下面是具體的實現(xiàn)代碼: publicClassSingleton { privatestaticSingletoninstance=null; privateSingleton(){} public?staticSingletongetI
2、nstance() { if(instance==null) instance=newSingleton(); returninstance; } } 我們說過這種實現(xiàn)方式不是thread-safe的,那么可以把上面的方法變成線程安全的嗎?當然可以,在方法getInstance()上加上synchronized修飾符就可以實現(xiàn)方法的同步了。但是這樣系統(tǒng)開銷會很大。具體代碼如下: publicClassSingleton { privatestaticSingletoninstance=null; privateSin
3、gleton(){} public?staticsynchronized?SingletongetInstance() { if(instance==null) instance=newSingleton(); returninstance; } } 每次有線程調(diào)用getInstance()方法,都需要同步判斷。這顯然不是最好的選擇,下面將會陸續(xù)介紹幾種thread-safe的方法?! ?兩種lazyloadedthread-safe的單例模式實現(xiàn)方式 1)DCL(doublecheckedlocking實現(xiàn)法) do
4、ublecheckedlocking,顧名思義,就是雙檢查法,檢查實例INSTANCE是否為null或者已經(jīng)實例化了。下面是具體的實現(xiàn)代碼: 1publicclassDoubleCheckedLockingSingleton{ 2?????privatevolatileDoubleCheckedLockingSingletonINSTANCE; 3 4?????privateDoubleCheckedLockingSingleton(){} 5 6?????publicDoubleCheckedLockingSingleton
5、getInstance(){ 7?????????if(INSTANCE==null){ 8????????????synchronized(DoubleCheckedLockingSingleton.class){ 9????????????????//doublecheckingSingletoninstance 10????????????????if(INSTANCE==null){ 11????????????????????INSTANCE=newDoubleCheckedLockingSingleton(); 1
6、2????????????????} 13????????????} 14?????????} 15?????????returnINSTANCE; 16?????} 17} 這種方法也很好理解,我們可以看到有兩次對instance是否為null的判斷:如果第一次判斷不為空,則直接返回實例就可以了;如果instance為空,則進入同步代碼塊再進行null值判斷,再選擇是否實例化。第一個null判斷可以減少系統(tǒng)的開銷。在實際項目中做過多線程開發(fā)的都應(yīng)該知道DCL.2)lazyinitializationholderclass模式
7、實現(xiàn)法 下面是這種方法的實現(xiàn)代碼: publicclassSingleton{ /** *類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實例與外部類的實例 *沒有綁定關(guān)系,而且只有被調(diào)用到才會裝載,從而實現(xiàn)了延遲加載 */ privatestaticclassSingletonHolder{ /** *靜態(tài)初始化器,由JVM來保證線程安全 */ privatestaticSingletoninstance=newSingleton(); } /** *私有化構(gòu)造方法 */ privateSingleto
8、n(){ } publicstatic?SingletongetInstance(){ returnSingletonHolder.instance; } } 當getInstan