Java 单例模式
什么是单例模式?
单例模式(Singleton Pattern)是Java中最简单的设计模式之一,也是最常用的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。
备注
单例模式属于创建型模式,它提供了一种创建对象的最佳方式。
为什么需要单例模式?
单例模式的主要目的是:
- 确保一个类只有 一个实例
- 提供对该实例的全局访问点
- 控制共享资源的并发访问
在实际应用中,单例模式常用于:
- 配置管理器
- 日志记录器
- 数据库连接池
- 线程池
- 缓存
- 对话框
- 注册表设置
单例模式的实现方式
Java中实现单例模式的方式有多种,以下是几种常见的实现方式:
1. 懒汉式(线程不安全)
这种方式是最基本的实现方式,但它是线程不安全的:
public class Singleton {
private static Singleton instance;
// 私有构造函数,防止外部实例化
private Singleton() {}
// 提供一个全局访问点
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
警告
这种实现方式在多线程环境下可能会创建多个实例,因此不推荐在生产环境中使用。
2. 懒汉式(线程安全)
在方法上加入synchronized关键字,使得在同一时间只能有一个线程访问该方法:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种方式能够在多线程环境下工作,但效率较低,因为每次获取实例都需要进行同步。
3. 双重检查锁定(Double-Checked Locking)
这种方式综合了前两种方式的优点,既能保证线程安全,又能提高性能:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
提示
使用volatile
关键字可以防止指令重排序,确保在多线程环境下也能正确工作。