單例模式

1.關于雙檢測鎖定DCL的問題

public class SingletonKerriganD {     

    /**   
     * 單例對象實例   
     */    
    private static SingletonKerriganD instance = null;     

    public static SingletonKerriganD getInstance() {     
        if (instance == null) {     
            synchronized (SingletonKerriganD.class) {     
                if (instance == null) {     
                    instance = new SingletonKerriganD();     //A
                }     
            }     
        }     
        return instance;     
    }     
}    

A處的代碼的匯編大致執行如下幾步
1.分配內存
2.初始化
3.變量指向這個內存
在java上由于支持處理器亂序執行,2和3的順序是不定的,假如3先執行了,那么第二個線程在訪問的時候會因為變量不為空直接返回,但這時還沒有初始化,所以可以遇見的一定會報錯。
在c語言中是可行的,在java1.5以后呢引入了volatile ,volatile修飾的變量,保證每次都從堆中讀取,保證在2,3沒有完全執行完的時候不會有人可以訪問到他。會影響一定的效率

那么可以采用內部靜態類的方式。

public class SingletonKerrigan implements Serializable {     

    private static class SingletonHolder {     
        /**   
         * 單例對象實例   
         */    
        static final SingletonKerrigan INSTANCE = new SingletonKerrigan();     
    }     

    public static SingletonKerrigan getInstance() {     
        return SingletonHolder.INSTANCE;     
    }     

    /**   
     * private的構造函數用于避免外界直接使用new來實例化對象   
     */    
    private SingletonKerrigan() {     
    }     

    /**   
     * readResolve方法應對單例對象被序列化時候   
     */    
    private Object readResolve() {     
        return getInstance();     
    }     
} 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.單例模式概述 (1)引言 單例模式是應用最廣的模式之一,也是23種設計模式中最基本的一個。本文旨在總結通過Ja...
    曹豐斌閱讀 3,006評論 6 47
  • 單例模式的實現 單例模式的實現一般來說有2種方式:懶漢式(延遲加載)、餓漢式(非延遲加載)。 1. 餓漢式(非延遲...
    JerryL_閱讀 986評論 0 3
  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,298評論 4 34
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,541評論 1 8
  • 一.什么是單例模式 單例模式的定義:確保一個類只有一個實例,并提供一個訪問他的全局訪問點。單例模式是幾個設計模式中...
    Geeks_Liu閱讀 2,248評論 0 10