long
和double
读写操作不是原子操作,因为它们的大小超过了cpu字大小。
如果我有64位机器,那么我可以获得long
和double
的原子读写操作吗?
答案 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)
直接回答这个问题,使用volatile
或AtomicLong会使实际的读/写原子化。
但是,排除某些特定情况后,它们通常不足 - 这就是它们确保读/写本身是原子的,但不保证程序是线程安全的。
要创建真正的原子用法,通常必须建立更大的原子上下文。最基本的形式是synchronized
。