volatile变量

1.volatile的原理

volatile的原理实际上是告诉处理器,不要把变量缓存在寄存器或者相对于其他处理器不可见的地方,而是把变量放在主存,每次读写操作都在主存上进行操作。另外,被申明为volatile的变量也不会与其它内存中的变量进行重排序。

2.volatile与同步

volatile是同步的一个子集,只保证了变量的可见性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。

相对于同步而言,volatile的优势

a.简易性,可以像使用其他变量一样使用volatile变量

b.volatile变量不会造成线程阻塞。

c.如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势。

3.正确使用volatile的条件

对变量的写操作不依赖于当前值。

该变量没有包含在具有其他变量的不变式中。

对于第一条,

private volatile int i=1;
 
...
 
i++;

虽然i++只有一条语句,实际上这条语句是分三步执行的

读入i,i加1,写入i。

若在第三步执行过程前,其他线程对i进行了改动,此时的结果将是错的。因此即使使用了volatile进行控制,并不能保证这个操作是线程安全的。

这类问题的解决方案有两种:

一种是采用synchronized进行同步控制,这显然违背了volatile的初衷

一种是采用CPU原语进行控制。在jdk1.5之后,java.util.concurrent.atomic包下的很多类就是采用这种方式进行控制,这样可以在保持性能的情况下,保证数据的线程安全。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值