为什么要使用volatile修饰呢?
1.禁止指令重排序
创建对象要经过如下几个步骤
a. 分配内存空间
b. 调用构造器,初始化实例
c. 返回地址给引用
但是JVM具有指令重排的特性,执行的顺序有可能变成 a-c-b,指令重排在单线程下不会出现问题,但是在多线程下会导致一个线程获得还没有初始化的实例。例如:线程T1执行了a,b,此时线程T2调用getInstance()方法发现INSTANCE不为null,因此返回INSTANCE,但此时INSTANCE还未被初始化。
2.保证可见性
由于可见性问题,线程T1在自己的工作线程内创建了实例,但此时还未同步到主内存中,此时线程T2判断INSTANCE还是null,那么线程T2又将在自己的工作线程创建一个实例,这样就创建了多个实例
如果加上了volatile修饰INSTANCE之后,保证了可见性,一旦线程T1返回了实例,线程T2可以立即发现INSTANCE不为null
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程