核心原理
- 构造函数私有化
- 获取实例的方法静态化 (保存线程安全)
常见单例实现代码
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();
}
}
网友评论