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

    推荐阅读