看到网上有些文章说 int a = 10; 是原子性操作, 对此我有点疑惑
如果单单的 a = 10; 这个是原子性的, 只进行了 assign 操作
但是 int a = 10; 我感觉不是原子性的.
一个新的变量只能在主存中"诞生" -- 《深入理解 Java 虚拟机》
据此说法我认为 int a = 10; 是需要 read -> load -> assign 三次操作来完成
看到网上有些文章说 int a = 10; 是原子性操作, 对此我有点疑惑
如果单单的 a = 10; 这个是原子性的, 只进行了 assign 操作
但是 int a = 10; 我感觉不是原子性的.
一个新的变量只能在主存中"诞生" -- 《深入理解 Java 虚拟机》
据此说法我认为 int a = 10; 是需要 read -> load -> assign 三次操作来完成
原子操作要保证的内部状态封闭,不应该被外界感知到内部状态,状态要么是未操作要么是已操作。
反例:value == null 的状态可被外界修改
value = map.get(key)
if (value == null) {
map.put(key, newValue)
}
正例:
map.incrementAndGet(key)
回到提主的问题,int a = 10 从JVM层面确实需要多步完成,但是原子性并不是看操作的步数,而是看是否可以视为一个整体。
赋值语句不存在中间共享状态,因此对外认为是原子操作。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。
在你举的
int a = 10
的例子中,在 JVM 底层,可以通过锁和循环 CAS 的方式来实现原子操作。