文章出處

單例模式

確保單例類只有一個實例,而且這個單例類提供一個借口讓其他類獲取到這個唯一的實例;

  • 如果某各類創建時,需要消耗太多的資源,或者這個類占用很多內存,如果創建太多這個類的實例會導致內存占用太多,此時我們就可以使用單例模式;

    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對象的引用。

待續


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()