Java中volatile的使用,只能保证变量的可见性,不能保证原子性

volatile的理解

Volatile在Java编程中经常用到,尤其是在多线程的编程中,在多处理器开发中保证共享变量的“可见性”,Volatile关键之不能保证变量的原子性。

可见性的意识是,一个线程修改这个变量,另一个变了能获取到这个变量修改后的最新值。

volatile使用与状态标记,下面就是一个例子。

举个栗子

Volatile的共享变量在进行写操作时会有个LOCK操作,会使当前处理器缓存行的数据写入内存,并导致其他处理器中的该内存地址无效,处理器强制刷新缓存,这样就保证了数据的可见性。

只能在一些情形下使用 volatile 变量替代锁,实现线程安全,必须同时满足下面两个条件:对变量的写操作不依赖于当前值。 该变量没有包含在具有其他变量的不变式中。

对于“对变量的写操作不依赖于当前值”的理解就是不能保证类似这样的操作的线程安全性。

volatile a = 0;

a = a + 1;

对于“该变量没有包含在具有其他变量的不变式中”的理解,可以被写入 volatile 变量的这些有效值独立于任何程序的状态。

先说下什么是不变式,比如年龄必须大于等于零,高大于低,余额必须大于多少零等。

下面的例子就不能保证doSomething方法的线程安全,因为不变式中包含了其他的变量。

不能实现线程安全

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200304A0TZV100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券