Java原子特征vs Effective Java摘录

时间:2016-02-03 18:50:58

标签: java multithreading concurrency

如果类型为int(整数)的变量在Java中具有固有的原子性,根据Effective Java的摘录下面,那么为什么我们在示例中看到整数值的不一致状态: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

语言规范保证读取或写入变量 原子,除非变量是long或double类型[JLS,17.4.7]。换一种说法, 读取long或double以外的变量可以保证返回一个值 由一些线程存储到该变量中,即使多个线程修改了 并发变量而不同步。

以上项目与我相矛盾。

2 个答案:

答案 0 :(得分:5)

您的错误是将各个操作等同于读取值和将值写入递增等操作,这需要多次操作。

您链接的示例包含递增和递减int变量的示例。这些操作看起来像代码中的一个操作,但它们实际上是幕后的两个操作。要递增或递减,您必须读取值,更改它,然后写入值。

这些操作必须同步才能成为线程安全的,因为它们包含多个操作,如果由于竞争条件而被中断会导致错误的值。

即使个别读取或写入操作本身是一致的,也需要同步一组多个操作以保持一致性。

答案 1 :(得分:1)

读取/写入int是单原子操作:

int a = 10; // writing
doSomething(a); // reading

另一方面,递增和递减语句由多个操作组成:

a++;

相当于:

a = a + 1; // reading and writing
阅读第二个a后,在将总数写入第一个a之前,可以更改

a