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;
    }
}
相关推荐
程序员二叉4 分钟前
【Java】集合面试全套精讲|HashMap/ArrayList高频考点完整版
java·面试·哈希算法
专注VB编程开发20年25 分钟前
AI 生成C# WinForm 窗体 = 目前就是垃圾
开发语言·人工智能·c#
cfm_291426 分钟前
JVM GC垃圾回收初步了解
java·开发语言·jvm
心之伊始36 分钟前
LangChain4j RAG 实战:Java 后端如何把本地文档接入 Embedding 检索链路
java·架构·源码分析·csdn
~小先生~37 分钟前
Python从入门到放弃(一)
开发语言·python
许彰午1 小时前
17_synchronized关键字深度解析
java·开发语言
z落落1 小时前
C# 泛型接口和泛型类+泛型约束
开发语言·c#
阿正的梦工坊1 小时前
【Rust】02-变量、不可变性与基础类型
开发语言·后端·rust
阿正的梦工坊1 小时前
【Rust】08-集合类型、字符串与迭代器入门
开发语言·rust·c#
FuckPatience2 小时前
C# 使用泛型协变将派生类类型替换为基类类型
开发语言·c#