我有点困惑...
是否真的如此,从多个线程读写除long和double之外的所有内容都是原子操作,只需要在long和double上使用volatile?
我有点困惑...
是否真的如此,从多个线程读写除long和double之外的所有内容都是原子操作,只需要在long和double上使用volatile?
double
和long
),保证所有线程将看到实际写入该变量的某个值。 (对于double
和long
,根据JLS中的规定,第一个四字节可能由一个线程写入,最后四个字节由另一个线程写入。)但是除非将变量标记为volatile
,否则它们不一定会同时看到相同的值。volatile
,x += 3
也不是原子性的,因为它是x = x + 3
,这会进行读取和写入操作,在读取和写入之间可能会有对x
的写入。这就是为什么我们需要像java.util.concurrent
中的AtomicInteger
和其他工具一样的东西。从薄空安全:当一个线程没有同步地读取变量时,它可能会看到过期的值,但至少它看到的是实际由某个线程放置在那里的值,而不是某个随机值。对于所有变量,这是正确的,除了64位长整型和双精度浮点数,它们不是易失性的。JVM允许将64位读取或写入视为两个单独的32位操作,这些操作不是原子性的。
听起来不太对。
原子操作是一种强制所有线程等待访问资源,直到另一个线程完成它的操作。我不明白为什么其他数据类型不会是原子的,而有些却不是。
volatile关键字除了原子性写入值之外还有其他语义
它意味着其他线程可以立即看到更新后的值(并且它不能被优化掉)