在Java中,单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点。以下是使用懒汉式(线程不安全)、懒汉式(线程安全)、饿汉式以及使用枚举实现单例模式的简单示例。
### 懒汉式(线程不安全)
public class SingletonLazyUnsafe {
private static SingletonLazyUnsafe instance;
private SingletonLazyUnsafe() {}
public static SingletonLazyUnsafe getInstance() {
if (instance == null) {
instance = new SingletonLazyUnsafe();
}
return instance;
}
}
**注意**:这种实现方式在多线程环境下可能不安全,因为两个线程可能同时判断`instance`为null,然后都创建了一个新的实例。
### 懒汉式(线程安全)
public class SingletonLazySafe {
private static volatile SingletonLazySafe instance;
private SingletonLazySafe() {}
public static synchronized SingletonLazySafe getInstance() {
if (instance == null) {
instance = new SingletonLazySafe();
}
return instance;
}
// 或者使用双重检查锁定(Double-Check Locking)优化性能
// public static SingletonLazySafe getInstance() {
// if (instance == null) {
// synchronized (SingletonLazySafe.class) {
// if (instance == null) {
// instance = new SingletonLazySafe();
// }
// }
// }
// return instance;
// }
}
**注意**:使用`synchronized`关键字或双重检查锁定可以实现线程安全,但后者性能更优。
### 饿汉式
public class SingletonEager {
private static final SingletonEager instance = new SingletonEager();
private SingletonEager() {}
public static SingletonEager getInstance() {
return instance;
}
}
**注意**:这种方式基于类加载机制避免了多线程的同步问题,但是在类装载时就完成了实例化,没有达到Lazy Loading的效果。
### 使用枚举
public enum SingletonEnum {
INSTANCE;
// 可以添加方法
public void whateverMethod() {
}
}
**注意**:这种方法不仅代码简洁,而且由JVM从根本上提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或反射攻击的时候,这种单例的类仍然安全。
以上是Java中实现单例模式的几种常见方式。在实际开发中,可以根据具体需求选择最适合的实现方式。