在Java中,单例模式是一种常用的设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点。以下是一个简单的单例模式实现示例,使用了懒汉式和饿汉式两种常见的实现方式。
### 懒汉式(线程不安全)
public class SingletonLazy {
// 私有静态变量,延迟加载
private static SingletonLazy instance;
// 私有构造函数,防止外部实例化
private SingletonLazy() {}
// 提供一个全局的静态方法,返回唯一实例,使用时才进行实例化
public static SingletonLazy getInstance() {
if (instance == null) {
instance = new SingletonLazy();
}
return instance;
}
}
**注意**:这个懒汉式实现是线程不安全的。在多线程环境下,可能会创建多个实例。
### 懒汉式(线程安全)
为了解决线程安全问题,可以在`getInstance()`方法上添加`synchronized`关键字,但这会影响性能。
或者,使用双重检查锁定(Double-Checked Locking)来优化性能:
public class SingletonLazyThreadSafe {
// 使用volatile关键字防止指令重排序
private static volatile SingletonLazyThreadSafe instance;
private SingletonLazyThreadSafe() {}
public static SingletonLazyThreadSafe getInstance() {
if (instance == null) {
synchronized (SingletonLazyThreadSafe.class) {
if (instance == null) {
instance = new SingletonLazyThreadSafe();
}
}
}
return instance;
}
}
### 饿汉式
饿汉式单例在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
public class SingletonEager {
// 类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
private static final SingletonEager instance = new SingletonEager();
private SingletonEager() {}
public static SingletonEager getInstance() {
return instance;
}
}
以上示例展示了Java中单例模式的两种基本实现方式。懒汉式延迟加载实例,但可能面临线程安全问题;饿汉式则类加载时就完成实例化,避免了线程安全问题,但可能影响类加载的性能。