单例模式在Java中的7种实现:从懒汉式到静态内部类

饿汉式(线程安全)

在类加载时就完成实例化,通过静态变量直接初始化实例。线程安全由JVM类加载机制保证,但可能造成资源浪费(未使用时也加载)。

java 复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式(非线程安全)

延迟实例化,首次调用时创建对象。非线程安全,多线程环境下可能创建多个实例。

java 复制代码
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

同步方法懒汉式(线程安全)

在懒汉式基础上增加synchronized关键字保证线程安全,但每次获取实例都会同步,性能较差。

java 复制代码
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重检查锁定(线程安全)

通过两次判空和synchronized代码块减少同步次数,需使用volatile防止指令重排序。

modelscope.cn/learn/71399

modelscope.cn/learn/71398

modelscope.cn/learn/71395

modelscope.cn/learn/71393

modelscope.cn/learn/71391

modelscope.cn/learn/71389

modelscope.cn/learn/71387

modelscope.cn/learn/71385

modelscope.cn/learn/71383

modelscope.cn/learn/71381

modelscope.cn/learn/71379

modelscope.cn/learn/71377

modelscope.cn/learn/71375

modelscope.cn/learn/71373

modelscope.cn/learn/71371

java 复制代码
public class Singleton {
    private static volatile Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

静态内部类(线程安全)

利用静态内部类的加载机制实现延迟加载,由JVM保证线程安全且无同步开销。

java 复制代码
public class Singleton {
    private Singleton() {}
    
    private static class Holder {
        static final Singleton INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

枚举单例(线程安全)

通过枚举类型实现,天然防止反射和序列化破坏单例,写法简洁且线程安全。

java 复制代码
public enum Singleton {
    INSTANCE;
    
    public void doSomething() {
        // 业务方法
    }
}

ThreadLocal单例(线程隔离)

每个线程持有独立实例,适用于需要线程隔离的场景,非严格意义上的单例。

java 复制代码
public class Singleton {
    private static final ThreadLocal<Singleton> threadLocalInstance = 
        ThreadLocal.withInitial(Singleton::new);
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return threadLocalInstance.get();
    }
}
相关推荐
wdfk_prog5 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
卓怡学长5 小时前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
这个DBA有点耶8 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
许彰午8 小时前
95_Python内存管理与垃圾回收
开发语言·python
csdn2015_8 小时前
springboot读取配置的方法
java·spring boot·spring
多加点辣也没关系9 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜9 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
AOwhisky9 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
chouchuang10 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云云只是个程序马喽11 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php