資源描述:
《JAVA中單例模式的幾種實現(xiàn)方式.doc》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、JAVA中單例模式的幾種實現(xiàn)方式1 線程不安全的實現(xiàn)方法首先介紹java中最基本的單例模式實現(xiàn)方式,我們可以在一些初級的java書中看到。這種實現(xiàn)方法不是線程安全的,所以在項目實踐中如果涉及到線程安全就不會使用這種方式。但是如果不需要保證線程安全,則這種方式還是不錯的,因為所需要的開銷比較小。下面是具體的實現(xiàn)代碼: publicClassSingleton{ privatestaticSingletoninstance= null;privateSingleton(){} public? staticSingletongetInstance() {
2、if( instance== null)?。閚stance =newSingleton(); return instance; }?。∥覀冋f過這種實現(xiàn)方式不是thread—safe的,那么可以把上面的方法變成線程安全的嗎?當然可以,在方法getInstance()上加上synchronized修飾符就可以實現(xiàn)方法的同步了。但是這樣系統(tǒng)開銷會很大。具體代碼如下:publicClassSingleton{ privatestat(yī)icSingletoninstance?。絥ull; privateSingleton(){} public? stat
3、icsynchronized? SingletongetInstance()?。f( instance==null) instance=?。頴wSingleton(); returninstance; }} 每次有線程調用getInstance()方法,都需要同步判斷。這顯然不是最好的選擇,下面將會陸續(xù)介紹幾種thread-safe的方法?!?兩種lazyloaded thread—safe的單例模式實現(xiàn)方式1)DCL(double?。鉮eckedlocking實現(xiàn)法)doublecheckedlocking,顧名思義,就是雙檢查法,檢查實例
4、INSTANCE是否為null或者已經(jīng)實例化了。下面是具體的實現(xiàn)代碼:1publicclassDoubleCheckedLockingSingleton{?。????? privatevolatile DoubleCheckedLockingSingletonINSTANCE; 3 4????? privateDoubleCheckedLockingSingleton(){} 5 6?????publicDoubleCheckedLockingSingletongetInstance(){?。?????????if(INSTANCE==null){
5、 8???????????? synchronized(DoubleCheckedLockingSingleton.class){ 9????????????????//doublecheckingSingletoninstance 10?????????????????。椋妫↖NSTANCE==null){ 11????????????????????INSTANCE=new?。膐ubleCheckedLockingSingleton();12???????????????? } 13????????????} 14?????????}15??
6、???????returnINSTANCE; 16?????} 17} 這種方法也很好理解,我們可以看到有兩次對instance是否為null的判斷:如果第一次判斷不為空,則直接返回實例就可以了;如果instance為空,則進入同步代碼塊再進行null值判斷,再選擇是否實例化。第一個null判斷可以減少系統(tǒng)的開銷。在實際項目中做過多線程開發(fā)的都應該知道DCL.2)lazyinitializationholderclass模式實現(xiàn)法下面是這種方法的實現(xiàn)代碼:publicclassSingleton { /**?。惣壍膬炔款?,也就是靜態(tài)的成員式內部類,
7、該內部類的實例與外部類的實例 *沒有綁定關系,而且只有被調用到才會裝載,從而實現(xiàn)了延遲加載 */ ?。餽ivat(yī)estat(yī)ic classSingletonHolder{ /** ?。o態(tài)初始化器,由JVM來保證線程安全 */ privat(yī)estat(yī)icSingletoninstance=newSingleton(); }/**?。∷接谢瘶嬙旆椒ā。 rivate Singleton(){ ?。ublicstat(yī)ic?SingletongetInstance(){ return SingletonHolder.instance;?。?/p>
8、 } 當getInstance方法第一次被調用的時候,它第一次讀取SingletonHolder.insta