Java 单例模式实现:饿汉式、懒汉式与枚举方式
单例模式(Singleton Pattern)是设计模式中最常用的一种,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有几种常见的方法,包括饿汉式、懒汉式和枚举方式。本文将围绕这三种方式,通过代码示例进行详细解析。
1. 饿汉式
饿汉式(Eager Initialization)是在类加载时就立即初始化单例对象。这种方式简单直接,但可能会造成资源浪费,因为即使单例对象可能永远不会被使用,它也会被创建。
java
public class EagerSingleton {
// 在类加载时就创建单例对象
private static final EagerSingleton instance = new EagerSingleton();
// 私有构造函数,防止外部通过new创建对象
private EagerSingleton() {}
// 提供一个全局访问点
public static EagerSingleton getInstance() {
return instance;
}
}
2. 懒汉式
懒汉式(Lazy Initialization)是在第一次使用时才创建单例对象。这种方式可以节省资源,但如果没有处理好同步问题,可能会导致多个实例被创建。
2.1 同步方法
java
public class LazySingleton {
// 在类加载时不创建单例对象
private static LazySingleton instance;
// 私有构造函数,防止外部通过new创建对象
private LazySingleton() {}
// 提供一个同步方法获取单例对象
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
2.2 同步块
java
public class LazySingleton {
// 在类加载时不创建单例对象
private static LazySingleton instance;
// 私有构造函数,防止外部通过new创建对象
private LazySingleton() {}
// 提供一个同步块获取单例对象
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
2.3 双重校验锁
java
public class LazySingleton {
// 在类加载时不创建单例对象
private static volatile LazySingleton instance;
// 私有构造函数,防止外部通过new创建对象
private LazySingleton() {}
// 提供一个双重校验锁获取单例对象
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
3. 枚举方式
枚举方式(Enum Singleton)是Java推荐的单例实现方式。由于枚举类型在Java中是线程安全的,因此这种方式可以保证单例的唯一性和线程安全。
java
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
// 实现业务逻辑
}
}
总结
本文介绍了Java中实现单例模式的几种方式:饿汉式、懒汉式和枚举方式。饿汉式简单直接,但可能会造成资源浪费;懒汉式可以节省资源,但需要处理好同步问题;枚举方式是Java推荐的单例实现方式,可以保证单例的唯一性和线程安全。在实际开发中,应根据具体需求选择合适的单例实现方式。
Comments NOTHING