JAVA并发编程:volatile关键字

JAVA并发编程:volatile关键字

  1. 今下午读了《深入理解JVM》,将自己的感悟写在这儿,当做一个记录。由于理解得不够深入,希望读者理解。
  2. volatile 关键字作用?
    1)、禁止指令重排序。JVM的实现机制,为了让代码执行效率更高,会对指令进行重新排序,比如说,int i=2;i=3; 代码顺序是先 i=2赋值,再给 i=3赋值。但是在执行的时候,可能先给 i=3赋值,再给 i=2赋值。如果i用volatile修饰,就不会出现这种情况
    2)、保证变量对所有线程可见性。变量的申明都是在主内存中,每个线程在使用申明的变量的时候,都会将变量从主内存读取到线程的工作内存中,然后再进行相应的操作。这样就会存在一个问题,当多个线程同时操作同一个变量的时候,如A线程读取了B变量到A线程的工作内存中,然后C线程又读取了B变量,然后A线程将B变量自加一,并写入主内存变量B中,C线程也将B变量加一,再写入主内存变量B中,理想状态下,变量B应该增加了二,实际上只增加了一,导致了数据的不一致性。引起这个不一致的原因就是每个线程操作的数据都是主内存的副本,当一个线程改变了副本没及时同步到主内存中去,另一个线程又操作了旧的变量。为了解决这个问题,引入了volatile 关键字,当线程在使用变量之前,都会从主内存中去获取变量的最新值。
  3. 使用 volatile 就能保证在并发下线程安全吗?
    不能,因为java代码并不具有原子性。可能一句代码代表了底层的多条指令,如i++这条指令,在使用变量的时候,读取到的变量是最新值,但是在这条代码执行过程中,别的线程可能将i的值改变了,当i++执行完毕的时候,可能会导致真实值比期望值小。
  4. 在什么情况下可以使用volatile来保证线程安全呢?
    1)运算的结果不依赖当前值。例如:i=1;这种直接给变量赋值操作,i++的运算结果要依赖于当前i的值,这种就不能用volatile保证线程安全。
    2)变量不需要与其他的状态变量共同参与不变约束。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值