java中的单例模式

Java实现单例模式的几种方式:

1. 饿汉式(推荐,线程安全)

复制代码
public class Singleton {
    // 类加载时就初始化
    private static final Singleton INSTANCE = new Singleton();
    
    // 私有构造
    private Singleton() {
        // 防止反射攻击
        if (INSTANCE != null) {
            throw new RuntimeException("单例模式禁止反射创建");
        }
    }
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2. 静态内部类(推荐,懒加载)

复制代码
public class Singleton {
    private Singleton() {
        // 防止反射攻击
        if (InnerHolder.INSTANCE != null) {
            throw new RuntimeException("单例模式禁止反射创建");
        }
    }
    
    // 静态内部类
    private static class InnerHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    public static Singleton getInstance() {
        return InnerHolder.INSTANCE;
    }
}
  • 懒加载:只有调用getInstance()时才加载内部类

  • 线程安全:JVM保证类加载的线程安全

3. 双重检查锁(懒加载,线程安全)

复制代码
public class Singleton {
    // 必须加volatile,禁止指令重排序
    private static volatile Singleton instance;
    
    private Singleton() {
        // 防止反射攻击
        if (instance != null) {
            throw new RuntimeException("单例模式禁止反射创建");
        }
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
相关推荐
冉冰学姐15 小时前
基于ssm的技能比赛报名管理系统29817vn0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
java·数据库·spring·ssm 框架应用
代码雕刻家18 小时前
3.5.Maven-依赖管理-依赖配置&依赖传递
java·maven
Cg1362691597418 小时前
JS-对象-Dom案例
开发语言·前端·javascript
!chen18 小时前
MyBatis-plus拓展之字段类型处理器、自动填充和乐观锁
java·tomcat·mybatis
故事和你9118 小时前
sdut-程序设计基础Ⅰ-实验五一维数组(8-13)
开发语言·数据结构·c++·算法·蓝桥杯·图论·类和对象
Jin、yz19 小时前
JAVA 八股
java·开发语言
va学弟19 小时前
Java 网络通信编程(6):视频通话
java·服务器·网络·音视频
我是唐青枫19 小时前
C#.NET Span 深入解析:零拷贝内存切片与高性能实战
开发语言·c#·.net
pjw1988090319 小时前
Spring Framework 中文官方文档
java·后端·spring
lxh011319 小时前
数据流的中位数
开发语言·前端·javascript