0

0

在Java里如何实现线程安全的延迟初始化_Java并发对象创建说明

P粉602998670

P粉602998670

发布时间:2026-01-15 14:50:03

|

235人浏览过

|

来源于php中文网

原创

dcl在java 5前因volatile重排序约束弱易致“半初始化”;jdk 5+需用volatile保证安全;推荐静态内部类方案,线程安全、延迟加载、无同步开销。

在java里如何实现线程安全的延迟初始化_java并发对象创建说明

为什么直接用双重检查锁(DCL)容易出错

Java 5 之前,volatile 关键字对重排序约束较弱,即使写了双重检查锁,JVM 或 CPU 仍可能将 new Singleton() 的构造步骤(分配内存 → 初始化字段 → 设置引用)重排,导致其他线程看到一个未完全初始化的对象。这是最典型的“半初始化”问题。

常见错误现象包括:某个线程调用 getInstance() 后拿到非 null 实例,但访问其字段时抛出 NullPointerException 或读到默认值(如 0false)。

  • 必须把实例字段声明为 volatile,否则 DCL 不安全
  • JDK 5+ 才保证 volatile 的写-读语义能禁止相关重排序
  • 不要在 Singleton 构造器中启动线程、注册回调或调用可被子类重写的方法——这会暴露 this 引用

推荐做法:使用静态内部类实现延迟加载

这是目前最简洁、安全、且无需同步的方案。JVM 保证类的初始化是线程安全的,且仅在首次主动使用该类时触发(即调用 Holder.INSTANCE 时才加载 Holder 类)。

public class Singleton {
    private Singleton() {}
<pre class='brush:java;toolbar:false;'>private static class Holder {
    static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
    return Holder.INSTANCE;
}

}

立即学习Java免费学习笔记(深入)”;

优势明显:

  • 无显式同步,无 volatile,无 CAS,性能开销几乎为零
  • 天然线程安全,由 JVM 类加载机制保障
  • 真正延迟:直到第一次调用 getInstance() 才创建实例
  • 兼容所有 JDK 版本(包括 JDK 1.2+)

如果必须用枚举,要注意单例的可序列化行为

枚举是 Java 中唯一能天然防止反序列化破坏单例的方式,但它的延迟性不如静态内部类——枚举类在首次被“主动使用”(如访问其常量、调用其方法)时就完成初始化,不是严格意义上的“按需加载”。

Atoms.dev
Atoms.dev

AI创业智能体平台,通过多智能体系统实现业务自主构建与运营。

下载
public enum Singleton {
    INSTANCE;
<pre class='brush:java;toolbar:false;'>public void doSomething() { /* ... */ }

}

立即学习Java免费学习笔记(深入)”;

使用场景有限制:

  • 不能继承其他类(枚举已隐式继承 java.lang.Enum
  • 不能用于需要实现 Serializable 以外接口并动态代理的场景
  • 若类有复杂初始化逻辑(如依赖 Spring 容器),枚举无法注入依赖

别碰 AtomicReference + compareAndSet 实现延迟初始化

除非你明确要支持“多次尝试初始化并容忍失败重试”,否则没必要手动用 AtomicReference 模拟懒汉。它代码冗长、易出错,且在高竞争下性能反而不如静态内部类或 DCL(加了 volatile)。

典型误用:

  • 忘记用 new AtomicReference<singleton>()</singleton> 初始化,导致 NPE
  • compareAndSet(null, newInstance) 失败后没正确返回已存在的实例,造成内存泄漏或重复构造
  • 误以为 CAS 能替代内存屏障作用——其实仍需配合 volatile 语义才能安全发布对象

真正需要原子初始化控制的场景极少,多数时候是过早优化。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

155

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

253

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.10.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1878

2023.10.19

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号