單例模式可以說是我最早接觸的一種設計模式(當時還不知道設計模式的時候),等到後來說單例,才知道是一種設計模式,下面談談對單例的理解
概念:
確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例
註釋:1.私有構造方法
2.指向自己實例的私有靜態引用
3.以自己實例爲返回指的靜態的公有方法
適用性:
1.每次從getInstance()都能返回一個且唯一一個對象
2.資源共享的情況下,getInstance()必須適用多線程併發訪問
3.提高訪問性能
分類:
餓漢式和懶漢式
具體應用
餓漢式
<span style="font-size:18px;">public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
} </span>
遇到的問題:假設這樣的場景:兩個線程併發調用Singleton.getInstance(),假設線程一先判斷完instance是否爲null,既到if這裏。剛剛判斷完畢後,JVM將CPU資源切換給線程二,由於線程一還沒執行(instance = new SingletonA();),所以instance仍然是空的,因此線程二執行了new Signleton()操作。片刻之後,線程一被重新喚醒,它執行的仍然是new Signleton()操作。所以這種設計的單例模式不能滿足第2點需求。
<span style="font-size:18px;">public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
} </span>
用sychronized避免出現線程問題,但是消耗很大,所以,一般java中都是採用餓漢式,c中採用懶漢式
優點:
1.在內存中只有一個對象,節省內存空間
2.避免頻繁的創建和銷燬對象,提高性能
3.避免對共享資源的多重佔用
4.全局訪問
在Android中的應用
1.在應用編寫的時候的Application
2.日曆模塊(CalendarDatabaseHelper)、輸入法等等系統的應用
3.我用過一個Volley框架訪問往來,它的隊列就是單例模式RequestQueue requestQueue = BvinApp.getHttpQueue();(我這裏用的是Application,其實寫成單例更好,符合設計模式. . . . .)這樣可以保證程序的週期之內只有一個隊列