Java 语言 单例模式实现 饿汉式 懒汉式与枚举方式

Java阿木 发布于 19 天前 3 次阅读


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推荐的单例实现方式,可以保证单例的唯一性和线程安全。在实际开发中,应根据具体需求选择合适的单例实现方式。