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;
    }
}
相关推荐
自在极意功。1 小时前
Spring Boot 自动配置原理基本理解
java·spring boot·后端·自动配置原理
xyq20241 小时前
NumPy 创建数组
开发语言
lly2024061 小时前
Ruby 类和对象
开发语言
Dovis(誓平步青云)2 小时前
《C/C+++ Boost 轻量级搜索引擎实战:架构流程、技术栈与工程落地指南——构造正/倒排索引(中篇)》
开发语言·c++·搜索引擎
Autumn72992 小时前
【系统重装】PYTHON 入门——速通版
开发语言·python·conda·cuda
keyborad pianist2 小时前
Java应用基础 Day3
java·开发语言
笨蛋不要掉眼泪2 小时前
从零构建微服务网关:Spring Cloud Gateway 核心原理与实战配置详解
java·微服务·云原生·架构
南部余额2 小时前
Apache POI 从入门到实战:Excel 与 Word操作攻略
java·word·excel·poi
java1234_小锋2 小时前
Java高频面试题:怎么实现Redis的高可用?
java·开发语言·redis