引言
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在Java中实现单例模式需要考虑多线程环境下的安全性、延迟初始化以及序列化等问题。
1. 饿汉式单例模式
饿汉式单例模式在类加载时就创建实例,线程安全,但可能会造成资源浪费。
package cn.juwatech.singleton; public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() { // 私有构造方法 } public static EagerSingleton getInstance() { return instance; } }
2. 懒汉式单例模式(线程不安全)
最简单的懒汉式单例模式,延迟实例化,但在多线程环境下不安全。
package cn.juwatech.singleton; public class LazySingleton { private static LazySingleton instance; private LazySingleton() { // 私有构造方法 } public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
3. 懒汉式单例模式(双重检查锁)
通过双重检查锁定(double-checked locking)实现延迟初始化,并保证线程安全性。
package cn.juwatech.singleton; public class DoubleCheckedSingleton { private static volatile DoubleCheckedSingleton instance; private DoubleCheckedSingleton() { // 私有构造方法 } public static DoubleCheckedSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedSingleton.class) { if (instance == null) { instance = new DoubleCheckedSingleton(); } } } return instance; } }
4. 静态内部类单例模式
利用Java的类加载机制,实现延迟初始化,线程安全。
package cn.juwatech.singleton; public class StaticInnerClassSingleton { private StaticInnerClassSingleton() { // 私有构造方法 } private static class SingletonHolder { private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton(); } public static StaticInnerClassSingleton getInstance() { return SingletonHolder.INSTANCE; } }
5. 枚举单例模式
枚举类型在Java中天生支持单例模式,线程安全且实现简洁。
package cn.juwatech.singleton; public enum EnumSingleton { INSTANCE; // 可选的成员变量和方法 // ... public void doSomething() { // 单例方法实现 } }
6. 总结
本文介绍了在Java中实现单例模式的几种常见方法,包括饿汉式、懒汉式(线程不安全和双重检查锁)、静态内部类和枚举单例模式。每种方法都有其适用的场景和优缺点,在选择时需要根据具体需求和线程安全性要求进行权衡。