使用靜態內部類實現單例設計模式


            前幾天看了下公司代碼中的一個單例類,發現居然是用靜態內部類實現的。后面在網上找了下資料,發現使用靜態內部實現的單例是懶加載的且線程安全。
            從網上資料得出如下結論: 加載一個類時,其內部類不會同時被加載。一個類被加載,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被調用時發生。

一、代碼

package com.zxy.test;
/**      
 * 使用靜態內部類實現的單例類
 * @author  ZENG.XIAO.YAN    
 * @date    2017-08-08 10:29:20
 * @version  V1.0    
 */

public class UserSingleton {
    
    /** 私有化構造器 */
    private UserSingleton() {
    }

    /** 對外提供公共的訪問方法 */
    public static UserSingleton getInstance() {
        return UserSingletonHolder.INSTANCE;
    }

    
    /** 寫一個靜態內部類,里面實例化外部類 */
    private static class UserSingletonHolder {
        private static final UserSingleton INSTANCE = new UserSingleton();
    }

}
package com.zxy.test;
/**     
 * 使用靜態內部類實現的單例類
 * @author  ZENG.XIAO.YAN    
 * @date    2017-08-08 10:29:20
 * @version  V1.0    
 */
public class UserSingleton {
	
	/** 私有化構造器 */
    private UserSingleton() {
    }

    /** 對外提供公共的訪問方法 */
    public static UserSingleton getInstance() {
        return UserSingletonHolder.INSTANCE;
    }
    
    /** 寫一個靜態內部類,里面實例化外部類 */
    private static class UserSingletonHolder {
        private static final UserSingleton INSTANCE = new UserSingleton();
    }

}

二、小結

        (1)為什么這樣實現就是單例的?
                 因為這個類的實例化是靠靜態內部類的靜態常量實例化的。
                 INSTANCE 是常量,因此只能賦值一次;它還是靜態的,因此隨着內部類一起加載。
        (2)這樣實現有什么好處?
                  我記得以前接觸的懶漢式的代碼好像有線程安全問題,需要加同步鎖才能解決。
                  采用靜態內部類實現的代碼也是懶加載的,只有第一次使用這個單例的實例的時候才加載;
                   同時不會有線程安全問題
        (3)參考文檔
                     http://yongliang567.iteye.com/blog/904467


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM