Java单例模式的用处详解
单例模式是Java中最常用的设计模式之一,它确保一个类只有一个实例,并提供一个全局访问点。下面详细解析单例模式的用处、实现方式及应用场景。
一、单例模式的核心用处
1. 资源管理与共享
-
数据库连接池:避免频繁创建和销毁数据库连接
-
线程池:统一管理线程资源
-
缓存系统:全局共享缓存数据
-
配置文件管理:统一读取和管理配置信息
2. 控制资源访问
-
日志记录器:确保所有日志写入同一个文件
-
打印池:控制打印任务的顺序执行
-
设备驱动:如打印机、显卡等硬件设备控制
3. 性能优化
-
减少对象创建开销:特别是重量级对象的创建成本
-
内存优化:避免重复实例化占用过多内存
4. 状态一致性
-
计数器:全局计数保持一致性
-
序列号生成器:确保ID唯一且有序
-
应用状态管理:如购物车、用户会话等
二、单例模式的实现方式
1. 饿汉式(Eager Initialization)
public class EagerSingleton {
// 类加载时就创建实例
private static final EagerSingleton INSTANCE = new EagerSingleton();
// 私有构造器防止外部实例化
private EagerSingleton() {
// 防止反射攻击
if (INSTANCE != null) {
throw new RuntimeException("单例模式不允许反射创建实例");
}
}
// 全局访问点
public static EagerSingleton getInstance() {
return INSTANCE;
}
// 业务方法示例
public void doSomething() {
System.out.println("单例方法执行");
}
}
优点:线程安全,实现简单
缺点:如果实例未被使用,会造成内存浪费
2. 懒汉式(Lazy Initialization)
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
// 线程不安全版本
public static LazySingleton getInstanceUnsafe() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
// 线程安全版本 - 方法同步
public static synchronized LazySingleton getInstanceSync() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
优点:延迟加载,节省资源
缺点:同步方法性能较低
3. 双重检查锁定(Double-Checked Locking)
public class DoubleCheckedSingleton {
// 使用volat
Java单例模式核心用途解析

最低0.47元/天 解锁文章
75

被折叠的 条评论
为什么被折叠?



