Java单例模式

核心原理

  • 构造函数私有化
  • 获取实例的方法静态化 (保存线程安全)

常见单例实现代码

1. 最简单

/**
 * 懒汉模式(每次获取实例需要进行同步)
 */
public class ConfigManager {
    public static ConfigManager mInstance = null;

    /**
     * 构造方法私有化
     */
    private ConfigManager() {

    }

    /**
     * 获取实例的方法 静态化 (获取方法要保证线程安全)
     *
     * @return
     */
    public static synchronized ConfigManager getInstance() {
        if (mInstance == null) {
            mInstance = new ConfigManager();
        }
        return mInstance;
    }
}

2. 最常用

/**
 * DCL(double check lock )
 * 进行了两层判断,第一层避免了不必要的同步
 * 第二层为了mInstance == null的时候,多线程创建的实例的安全问题
 */
public class ConfigManager {
    public static volatile ConfigManager mInstance = null;

    /**
     * 构造方法私有化
     */
    private ConfigManager() {

    }

    /**
     * 获取实例的方法 静态化 (获取方法要保证线程安全)
     *
     * @return
     */
    public static ConfigManager getInstance() {
        if (mInstance == null) {
            synchronized (ConfigManager.class) {
                if (mInstance == null) {
                    mInstance = new ConfigManager();
                }
            }
        }
        return mInstance;
    }
}

3. 最推荐

/**
 * 静态内部类
 * 只有当调用getInstance的时候,才会去实例化ConfigManger的实例
 * 

* 加载一个类时,内部类不会立马同时被加载。当且仅当内部的静态成员(构造器、静态方法等)被调用时才会去加载该内部类 *

* 达到了延迟加载,并且由JVM保证了线程安全。 */ public class ConfigManager { /** * 构造方法私有化 */ private ConfigManager() { } /** * 获取实例的方法 静态化 (获取方法要保证线程安全) * * @return */ public static ConfigManager getInstance() { return ConfigManagerHolder.mInstance; } private static class ConfigManagerHolder { private static final ConfigManager mInstance = new ConfigManager(); } }

你可能感兴趣的:(Java单例模式)