单例模式在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();
    }
}
相关推荐
学长毕设7 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h7 小时前
c++ string
开发语言·c++
raindayinrain7 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的7 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao7 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw8 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
学逆向的8 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的8 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”8 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号9 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统