如果int (整数)类型的变量在Java中本质上是原子的,正如下面有效的Java摘录所示,那么为什么我们在示例中看到整数值的不一致状态:https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
语言规范保证读或写变量是原子的,除非变量类型为long或double JLS,17.4.7。换句话说,读取一个变量(而不是一个长变量或双变量)可以保证返回某个线程存储到该变量中的值,即使多个线程同时修改该变量而不进行同步。
以上各项与我有矛盾之处。
发布于 2016-02-03 18:57:08
您的错误是将单个操作(例如读取值和写入值)等同于需要多个操作的增量操作。
链接到的示例包含递增和递减int变量的示例。这些操作看起来像代码中的一个操作,但它们实际上是幕后的两个操作。若要增加或减少,必须读取该值,将其更改,然后写入该值。
这些操作必须是同步的,才是线程安全的,因为它们由多个操作组成,如果这些操作被中断,会由于争用条件而导致不正确的值。
即使单个读或写操作本身是一致的,也需要同步一组多个操作以保持一致性。
发布于 2016-02-03 18:58:21
读/写int是单原子操作:
int a = 10; // writing
doSomething(a); // reading另一方面,增量和递减语句由多个操作组成:
a++;相当于:
a = a + 1; // reading and writinga可以在读取第二个a之后和将总数写入第一个a之前进行更改。
https://stackoverflow.com/questions/35185260
复制相似问题