单例模式
在有些系统中,为了减少内存开支、保证数据内容的一致性,对某些类只创建一个惟一的访问点实例,这就是所谓的单例模式。
在计算机系统中,如 Windows 的回收站、打印机的后台处理服务,
在我们javaweb项目中的日志对象、数据库的连接池、配置对象、缓存对象或者持久化对象等常常被设计成单例。
单例模式有 3 个特点:
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点;
懒汉式单例
该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
public class LazySingleton {
// 保证 instance 在所有线程中同步,禁止指令重排序
private static volatile LazySingleton instance = null;
private LazySingleton(){} //private 避免类在外部被实例化
public static synchronized LazySingleton getInstance() {
//getInstance 方法前加同步
if (instance==null) {
instance=new LazySingleton();
}
return instance;
}
// 双重检查
public static LazySingleton getInstanceB() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
饿汉式单例
该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。所以也就不存在线程安全的问题了
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance() {
return instance;
}
}

浙公网安备 33010602011771号