美文网首页
Java单例模式

Java单例模式

作者: topone37 | 来源:发表于2018-08-31 15:22 被阅读6次

核心原理

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

常见单例实现代码

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的实例
 * <p>
 * 加载一个类时,内部类不会立马同时被加载。当且仅当内部的静态成员(构造器、静态方法等)被调用时才会去加载该内部类
 * <p>
 * 达到了延迟加载,并且由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单例模式

      本文链接:https://www.haomeiwen.com/subject/qygswftx.html