首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java原子特性与有效Java摘录

Java原子特性与有效Java摘录
EN

Stack Overflow用户
提问于 2016-02-03 18:50:57
回答 2查看 113关注 0票数 3

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

语言规范保证读或写变量是原子的,除非变量类型为long或double JLS,17.4.7。换句话说,读取一个变量(而不是一个长变量或双变量)可以保证返回某个线程存储到该变量中的值,即使多个线程同时修改该变量而不进行同步。

以上各项与我有矛盾之处。

EN

回答 2

Stack Overflow用户

发布于 2016-02-03 18:57:08

您的错误是将单个操作(例如读取值和写入值)等同于需要多个操作的增量操作。

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

这些操作必须是同步的,才是线程安全的,因为它们由多个操作组成,如果这些操作被中断,会由于争用条件而导致不正确的值。

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

票数 5
EN

Stack Overflow用户

发布于 2016-02-03 18:58:21

读/写int是单原子操作:

代码语言:javascript
复制
int a = 10; // writing
doSomething(a); // reading

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

代码语言:javascript
复制
a++;

相当于:

代码语言:javascript
复制
a = a + 1; // reading and writing

a可以在读取第二个a之后和将总数写入第一个a之前进行更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35185260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档