2012-04-02 91 views
6

我有点糊涂了......什么操作都是原子操作

这是真的,阅读从多个线程\写所有除长和双是一个基本操作和它需要使用挥发性只长一倍?

+1

你有一个源为了这? – paislee 2012-04-02 20:51:05

回答

8

这听起来像你指的是JLS的this section。这是保证所有基本类型 - 除了doublelong - 所有的线程将看到实际写入该变量一些值。 (随着doublelong,前四个字节可能已经写一个线程,并通过另一个线程的最后四个字节,如在JLS,该节规定),但他们不一定会看到在相同值除非该变量被标记为volatile

即使使用volatilex += 3不是原子,因为它是x = x + 3,这确实读取和写入,并有可能写入读取和写入之间x。这就是为什么我们有AtomicIntegerjava.util.concurrent中的其他实用程序。

0

这听起来不对。

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

3

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

原子我的意思是,你不会读一些乱码对象尽可能多线程编写不同对象与同场的结果。

Java Concurrency In Practice 3.1.2

外的薄AIRE安全:当一个线程读取的变量,而不 同步,它可能会看到一个过时的值,但是至少它看到 值实际上是通过一些线程放置在那里的,而不是随机的一些值 。对于所有变量都是如此,除了64位long和 double,它们不是易失性的。允许JVM将64位 读取或写入为两个不是原子的独立32位操作。

0

挥发性具有其他语义不仅仅是编写价值原子

这意味着其他线程能够立即看到更新后的值(和它不能被优化掉)