Java单例模式详解:确保只有一个实例的设计模式
单例模式是Java中最常用的设计模式之一,它保证一个类只有一个实例,并提供一个全局访问点。 可以将其比作一个团队的经理:一个团队只有一个经理,所有成员都通过他进行沟通。本文将用简洁易懂的语言讲解单例模式的实现和优缺点。
以下列举几种常见的单例模式实现方式,并分析其优缺点及改进方法:
这种方法仅在需要时才初始化实例。
立即学习“Java免费学习笔记(深入)”;
import java.io.Serializable; public class LazySingleton implements Serializable { private static LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } // 解决序列化问题 private Object readResolve() { return getInstance(); } }
可视化: 想象一个图书馆,图书管理员只在有读者时才安排座位。if (instance == null) 就像图书管理员检查是否有空位,如果没有,就安排一个。
问题与解决:
使用synchronized关键字保证线程安全。
public class ThreadSafeSingleton implements Serializable { private static ThreadSafeSingleton instance; private ThreadSafeSingleton() {} public static synchronized ThreadSafeSingleton getInstance() { if (instance == null) { instance = new ThreadSafeSingleton(); } return instance; } // 解决序列化问题 private Object readResolve() { return getInstance(); } }
可视化: 就像一个只有一个烤箱的面包店,synchronized关键字就像烤箱的锁,保证一次只有一个面包师使用。
问题与解决: synchronized会带来性能开销,可以使用双重检查锁定优化。
减少同步开销,提高效率。
public class DoubleCheckedLockingSingleton implements Serializable { private static volatile DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } // 解决序列化问题 private Object readResolve() { return getInstance(); } }
可视化: 像银行金库,第一个if检查金库是否打开,同步块像守卫,第二个if防止重复打开。
问题与解决: 需要volatile关键字保证可见性,防止指令重排序问题。
这种方法利用静态内部类实现延迟加载和线程安全。
public class StaticInnerClassSingleton { private StaticInnerClassSingleton() {} private static class SingletonHelper { private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton(); } public static StaticInnerClassSingleton getInstance() { return SingletonHelper.INSTANCE; } }
可视化: 像一个带有投币口的自动售货机,内部预先准备好找零机制。
Java 5之后引入的枚举类型,天生线程安全,简单易用。
public enum EnumSingleton { INSTANCE; public void showMessage() { System.out.println("Hello from Enum Singleton!"); } }
可视化: 像一位君主,天生只有一个。
所有示例都添加了readResolve()方法来解决序列化问题。 选择哪种方式取决于具体的需求和Java版本。 对于大多数情况,建议使用静态内部类单例或枚举单例。
以上就是理解 Java 中的单例模式的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号