[设计模式] ------ 单例模式
單例模式,是眾多設(shè)計(jì)模式中,寫法最多,套路最多,坑最多,面試被問最多的設(shè)計(jì)模式。
基本上,單例模式在面試中已經(jīng)被問爛了,依稀記得我的上家公司面試我的時(shí)候,說到設(shè)計(jì)模式,直接就說,寫一種設(shè)計(jì)模式,但單例除外。
但不得不說,單例由于其概念簡(jiǎn)單,實(shí)用性廣的特點(diǎn),在項(xiàng)目中很是常見。
概念:
單例模式就是確保一個(gè)類只有一個(gè)實(shí)例的設(shè)計(jì)模式。
設(shè)計(jì)的思路無非就是先new一個(gè)實(shí)例,以后都用這個(gè)實(shí)例就行了。
難點(diǎn)在于什么時(shí)機(jī)new出這個(gè)實(shí)例,以及如何確保有且只有這一個(gè)實(shí)例。
五種常見的單例實(shí)現(xiàn)
第一種:餓漢式(新手寫法)
提前加載,所以也無法延遲加載,效率不高,不推薦
public class HungurySingleton { //缺點(diǎn),無法延時(shí)加載,沒有使用就已經(jīng)加載了private static final HungurySingleton mInstance = new HungurySingleton();private HungurySingleton(){}public static HungurySingleton getHunguryInstance(){return mInstance;} }第二種:懶漢式(入門寫法)
沒有提前加載,但多線程下并發(fā)可能會(huì)出現(xiàn)多個(gè)實(shí)例
public class LazySingleton {private static LazySingleton mInstance;private LazySingleton(){}public static LazySingleton getmInstance(){if(mInstance == null){//就是這里,如果兩個(gè)線程并發(fā)訪問,里面的new語句就會(huì)執(zhí)行兩次mInstance = new LazySingleton();}return mInstance;} }第三種:雙重檢查鎖(能寫出這個(gè),就有點(diǎn)東西了)
很明顯,這樣寫,就不怕上面的那種并發(fā)問題了
public class DLCSingleton {private static volatile DLCSingleton mInstance =null; //volatile關(guān)鍵字是為了禁止編譯器對(duì) volatile關(guān)鍵字修飾的變量進(jìn)行重排序,并保證volatile變量的讀操作發(fā)生在寫操作之后private DLCSingleton(){}public static DLCSingleton getmInstance(){if(mInstance == null){ //第一次檢查synchronized (DLCSingleton.class){ //同步代碼塊if(mInstance == null){ //第二次檢查mInstance = new DLCSingleton();}}}return mInstance;} }第四種:靜態(tài)內(nèi)部類實(shí)現(xiàn)(高手寫法)
利用靜態(tài)內(nèi)部類是在被調(diào)用時(shí)才會(huì)被加載,算是延遲加載
static final 修飾instance,初始化后就不會(huì)被修改,保證線程安全
第五種:(牛人寫法)
枚舉做單例,think in java中的神思想,雖然我從來沒見過誰在項(xiàng)目中實(shí)戰(zhàn)用到
但看這個(gè)網(wǎng)上說的熱火朝天,也是各種好處,比如寫法簡(jiǎn)單,線程安全
總結(jié):
我只是列出常用的,當(dāng)然,還有其他版本
比如靜態(tài)代碼塊的寫法,
還有雙重檢查鎖前一個(gè)版本,就是沒有第一步判空的寫法,
還有用synchronized修飾方法的寫法等等。
是我的話,一般情況下,
確保項(xiàng)目肯定沒有并發(fā)的話,懶漢寫法就沒問題了。
一考慮到并發(fā),就用雙重檢查鎖的寫法,是常用而且穩(wěn)定的。
至于枚舉寫法,總之我還沒有習(xí)慣這么寫,可以嘗試用用。
以上是個(gè)人意見,歡迎評(píng)論指正。
總結(jié)
以上是生活随笔為你收集整理的[设计模式] ------ 单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]--- 开箱即用的springb
- 下一篇: 通过AVFoundation框架获取摄像