[英]Atomic read and write of long and double values
long
和double
读写操作不是原子的,因为它们的大小超过cpu字大小。
如果我有64位机器,那么我可以获得long
和double
原子读写操作吗?
如果我有64位机器,我可以获得long和double的原子读写操作吗?
答案是“也许”。 答案取决于JVM实现以及机器架构。 引用Java语言定义17.7 :
某些实现可能会发现将64位长或双值上的单个写操作划分为相邻32位值上的两个写操作很方便。 为了效率,这种行为是特定于实现的; Java虚拟机的实现可以自由地以原子方式或分两部分执行对long和double值的写入。
鼓励Java虚拟机的实现避免在可能的情况下拆分64位值。 建议程序员将共享的64位值声明为volatile或正确同步其程序以避免可能的复杂情况。
这是一个关于在读取和写入64位值时确保原子性的好页面。
直接回答这个问题,使用volatile
或AtomicLong会使实际的读/写原子。
但是,排除某些特定情况后,它们本身通常是不够的 - 也就是说它们确保读/写本身是原子的,但不保证程序是线程安全的。
要创建真正的原子用法,通常必须建立更大的原子上下文。 在最基本的形式中,这是通过synchronized
完成的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.