Android 設計模式-單例模式,android設計模式

來源:互聯網
上載者:User

Android 設計模式-單例模式,android設計模式
Android 設計模式-單例模式什麼情況下需要單例模式?

  • 一些類提供公用功能供別人調用,本身不會處理商務邏輯
  • 類會被許多類和線程調用
設計單例模式
public class Singleton{private static Singleton mSingleton;private Singleton(){}public static Singleton getInstance(){if(mSingleton == null){     mSingleton = new Singleton();\\A    }    return mSingleton;  }}

上面的做法在多線程的時候會出現問題,比如有兩個線程同時調用getInstance(),這時會new兩個對象出來。

單例模式改進1
public class Singleton{private static Singleton mSingleton;private Singleton(){}public static Singleton getInstance(){  synchronized(Singleton.class){    if(mSingleton == null){     mSingleton = new Singleton();\\A    }    return mSingleton;   }  }}

這種方式還是會有問題,就是高並發情況下多線程去搶奪鎖,假如有幾百個線程,其中有一個運氣比較差,這個線程就會出現一直去getInstance,資源一直返回不回去,UI也不會得到更新。

單例模式改進2
public class Singleton{private volatile static Singleton mSingleton;private Singleton(){}public static Singleton getInstance(){  if(mSingleton == null){\\A    synchronized(Singleton.class){\\C     if(mSingleton == null)      mSingleton = new Singleton();\\B      }    }    return mSingleton;  }}

註:volatile是防止cpu進行指令重排序,防止代碼順序被更改。
這種方式比較好的地方在於第一次建立執行個體時候就會同步所有的線程,以後再擷取執行個體就會直接返回。

但是看代碼好像還是有人會有疑問,為什麼需要兩次判斷為null?

其實這個意義在於防止多個線程同時進入第一個if內,比如說線程A執行到A行,線程B執行到B行,線程B還沒有返回。當線程A執行到C行,這時線程B初始化執行個體完畢,如果沒有裡面的再一次判斷就會產生兩個執行個體!所以兩次的判斷null還是有意義的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.