文章出處
文章列表
單例模式
確保單例類只有一個實例,而且這個單例類提供一個借口讓其他類獲取到這個唯一的實例;
如果某各類創建時,需要消耗太多的資源,或者這個類占用很多內存,如果創建太多這個類的實例會導致內存占用太多,此時我們就可以使用單例模式;
public class Singleton { private static volatile Singleton instance = null; private Singleton(){ } public static Singleton getInstance(){ if (instance == null){ synchronized ( Singleton.class){ if (instance == null){ instance = new Singleton(); } } } return instance; } }
- 第一次判斷是為了避免不必要的同步,第二次判斷是為了確保在此之前沒有其他線程進入到sychronized塊創建了新實例;
- 不在public static Singleton getInstance()中加synchronized是為了避免同步執行,導致的效率低;
由于instance = new Singleton();會執行1)給Singleton的實例分配內存,2)調用Singleton的構造函數初始化字段,3)將instance對象執行分配的對象,但是由于無法確保上面三個執行的順序,有可能先將instance指向內存實例,再進行初始化,所有我們需要加上volatile修飾,線程每次調用volatile修飾的變量的時,都會去堆中拿最新的數據,確保instance是最新的。
Android中的單例模式,比如:獲取WindowManager對象的引用。
待續
文章列表
全站熱搜