什么操作是原子操作

时间:2012-04-02 20:47:36

标签: java

我有点困惑......

从long和double除了long和double之外的几个线程读取\写入是真的,并且只需要使用long和double吗?

4 个答案:

答案 0 :(得分:8)

听起来你指的是JLS的this section。除了doublelong之外,所有原始类型都保证所有线程都会看到实际写入该变量的某些值。 (对于doublelong,前四个字节可能由一个线程写入,最后四个字节由另一个线程写入,如JLS的该部分所述。)但它们不会除非变量标记为volatile,否则必须同时看到相同的值。

即使使用volatilex += 3也不是原子的,因为它是x = x + 3,它执行读取和写入,并且可能在读取之间写入x和写。这就是我们在AtomicInteger中使用java.util.concurrent和其他实用程序的原因。

答案 1 :(得分:3)

让我们不要将原子与线程安全混淆。长写和双写不是原子的,因为每个都是两个独立的32位存储。存储和加载非长/双字段是完全原子的,假设它们不是复合写入(例如i++)。

原子意味着你不会因为许多线程将不同的对象写入同一个字段而读取一些乱码对象。

来自Java Concurrency In Practice 3.1.2

  

超薄安全性:当线程读取变量时没有   同步,它可能会看到陈旧的价值,但至少它看到了   某些线程而不是某些线程实际放置的值   随机值。对于所有变量都是如此,除了64位长和   双,不挥发。允许JVM处理64位   读或写为两个不是原子的单独32位操作。

答案 2 :(得分:0)

这听起来不对。

原子操作是强制所有线程等待访问资源直到另一个线程完成它的操作。我不明白为什么其他数据类型是原子的,有些则不是。

答案 3 :(得分:0)

volatile除了原子地写入值之外还有其他语义

这意味着其他线程可以立即看到更新后的值(并且无法优化)