Java原子特征vs Effective Java摘录

Dav*_*run 3 java concurrency multithreading

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

语言规范保证读取或写入变量是原子的,除非变量的类型为long或double [JLS,17.4.7].换句话说,读取long或double以外的变量可以保证返回某个线程存储到该变量中的值,即使多个线程同时修改变量而没有同步也是如此.

以上项目与我相矛盾.

rge*_*man 5

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

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

必须将这些操作同步为线程安全的,因为它们包含多个操作,如果由于竞争条件而中断将导致不正确的值.

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