
单例模式
发布日期:2021-05-08 12:13:17
浏览次数:20
分类:精选文章
本文共 1438 字,大约阅读时间需要 4 分钟。
一、懒汉式单例模式
懒汉式单例模式通过将单例对象的初始化延迟到第一次使用时完成,能够在大多数情况下减少内存占用,尤其适用于资源有限的环境。为了保证线程安全,懒汉式通常会在newInstance
方法中使用sync
关键字进行加锁。
package com.ed.singleton;public class Singleton { private static Singleton singleton; // 单例对象 private Singleton() { // 私有构造函数,防止外部new创建 } public static Singleton newInstance() { synchronized (singleton) { // 使用synchronized确保线程安全 if (singleton == null) { singleton = new Singleton(); } } return singleton; }}
这种实现方式在单线程环境下表现优异,但在多线程环境下可能会导致多个线程同时进入newInstance
方法,从而导致并发访问问题。
二、饿汉式单例模式
饿汉式单例模式通过立即初始化单例对象,确保在任何情况下都能快速访问单例实例。这种方式可以避免线程安全问题,但可能会因为提前创建对象而带来内存资源的浪费。
package com.ed.singleton;public class Singleton2 { private static Singleton2 singleton = new Singleton2(); // 单例对象在类加载时就初始化 private Singleton2() { // 私有构造函数,防止外部new创建 } public static Singleton2 newInstance() { return singleton; }}
饿汉式的优点在于简单且高效,适用于对线程安全要求不高的场景。
三、Holder单例模式
Holder单例模式结合了懒汉式和饿汉式的优点,通过使用静态内部类的机制实现了延迟加载和线程安全。这种方式不仅保证了单例对象的唯一性,还可以避免外部代码误操作导致的内存泄漏。
package com.ed.singleton;public class Singleton4 { // 静态内部类用于延迟初始化 private static class LazyHolder { private static final Singleton4 instance = new Singleton4(); // 延迟初始化单例对象 } private Singleton4() { // 私有构造函数,防止外部new创建 } public static final Singleton4 getInstance() { return LazyHolder.instance; // 通过静态访问方式获取单例实例 }}
这种实现方式通过JVM的静态初始化机制,确保了单例对象的线程安全,同时延迟了对象的初始化,减少了内存开销。