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();
}
}
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机