是简单的getter调用volatile变量原子操作吗?

时间:2015-06-19 11:50:15

标签: java concurrency volatile atomicity

我班上有以下内容:

private static volatile byte counter = 0;
public static byte getCounter() {return counter;}

getCounter的调用是否原子?

1 个答案:

答案 0 :(得分:10)

是的,这是一个原子操作,在某种意义上说,没有重新排序或定时会导致在部分写入时读取字节。如果在读取字节时重新分配字节,则保证getter返回before或after值,但没有其他值,即使没有volatile

但是,必须对double或long值设置volatile,以避免不一致的读取既不是旧值也不是新值:

  

出于Java编程语言内存模型的目的,对非易失性long或double值的单次写入被视为两个单独的写入:每个32位一半写入一次。这可能导致线程从一次写入看到64位值的前32位,而从另一次写入看到第二次32位。

     

鼓励Java虚拟机的实现避免在可能的情况下拆分64位值。建议程序员将共享的64位值声明为volatile或正确同步其程序以避免可能的复杂情况。

来源:JLS8 section 17.7

相关问题