int a = 10; 是原子性操作吗

看到网上有些文章说 int a = 10; 是原子性操作, 对此我有点疑惑
如果单单的 a = 10; 这个是原子性的, 只进行了 assign 操作
但是 int a = 10; 我感觉不是原子性的.
一个新的变量只能在主存中"诞生" -- 《深入理解 Java 虚拟机》
据此说法我认为 int a = 10; 是需要 read -> load -> assign 三次操作来完成

阅读 5.3k
2 个回答

原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。

在你举的 int a = 10 的例子中,在 JVM 底层,可以通过锁和循环 CAS 的方式来实现原子操作。

原子操作要保证的内部状态封闭,不应该被外界感知到内部状态,状态要么是未操作要么是已操作。

反例:value == null 的状态可被外界修改
value = map.get(key)
if (value == null) {
    map.put(key, newValue)
}

正例:
map.incrementAndGet(key)

回到提主的问题,int a = 10 从JVM层面确实需要多步完成,但是原子性并不是看操作的步数,而是看是否可以视为一个整体。
赋值语句不存在中间共享状态,因此对外认为是原子操作。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题