我们真的了解Volatile 吗?

本文通过一个单例模式的例子,详细解释了Java中volatile关键字的作用,说明了其在多线程环境下确保变量可见性的原理,并通过对比未使用volatile的情况,展示了其在并发编程中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   
 Volatile,JAVA5之后出现的多线程同步读锁属性修饰符。
让我们看一下一个单例的例子:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 public class Singleton{
 2 private static volatile Singleton _instance; //volatile variable 
 3 
 4 public static Singleton getInstance(){
 5 
 6    if(_instance == null){
 7             synchronized(Singleton.class){
 8               if(_instance == null)
 9               _instance = new Singleton();
10             }
11 
12    }
13    return _instance;
14 
15 }
16 
17 
18 Read more: http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz3pfcVVsK1
19 
很明显,我们可以得出两个结论
1 instance只初始化一次
2 instance第一次初始化会比较慢

想想,如果我们不用volatile ,会有什么结果。每个线程都会有一个线程变量区,彼此并不相通。当有A,B两个线程同时走到第6步,如果线程A得到锁,完成初始化instance之后,线程B同样进入第8步,这样其实是两个instance的。
通过加上volatle,线程B会把instance变量回写到主内存。如果其它线程进来,instance肯定就不是空值了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值