原子读写long和double值

时间:2014-04-16 21:51:32

标签: java multithreading atomicity

longdouble读写操作不是原子操作,因为它们的大小超过了cpu字大小。

如果我有64位机器,那么我可以获得longdouble的原子读写操作吗?

2 个答案:

答案 0 :(得分:10)

  

如果我有64位机器,那么我可以获得long和double的原子读写操作吗?

答案是"也许"。答案取决于JVM实现以及机器架构。引用Java Language definition 17.7

  

某些实现可能会发现将64位长或双值上的单个写操作划分为相邻32位值上的两个写操作很方便。为了效率,这种行为是特定于实现的; Java虚拟机的实现可以原子地或分两部分对long和double值进行写入。

     

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

这是一个关于Ensure atomicity when reading and writing 64-bit values的精彩页面。

答案 1 :(得分:2)

直接回答这个问题,使用volatileAtomicLong会使实际的读/写原子化。

但是,排除某些特定情况后,它们通常不足 - 这就是它们确保读/写本身是原子的,但不保证程序是线程安全的。

要创建真正的原子用法,通常必须建立更大的原子上下文。最基本的形式是synchronized