首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >增量运算原子性

增量运算原子性
EN

Stack Overflow用户
提问于 2015-07-25 05:03:50
回答 2查看 342关注 0票数 0

我正在学习多线程编程从'Java并发在实践‘。

书中一度说,即使是看起来无害的增量操作也不是线程安全的操作,因为它由三个不同的operations...read、modify组成。

代码语言:javascript
运行
复制
class A {
  private void int c;

  public void increment() {
    ++c;
  }
}

因此,增量语句不是原子的,因此也不是线程安全的。

我的问题是,如果一个环境真的是并发的(即多个线程能够完全同时执行它们的程序语句),那么一个真正是原子的语句也不可能是线程安全的,因为多个线程可以读取相同的值。那么,如何使用原子语句来帮助实现并发环境中的线程安全呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-25 05:11:21

在修改状态时,不存在真正的并发性。

This post对并发性和并行性有一些很好的描述。

如@RitchieHindle在那篇文章中所述:

并发是指两个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着他们将永远在同一时刻运行。例如:在一台单核机器上多任务处理。

例如,非原子操作的危险在于,一个线程可能读取该值,另一个线程可能修改该值,然后原始线程可能修改和写入该值(从而否定了第二个线程所做的修改)。

原子操作不允许其他操作在原子操作中间访问状态。例如,如果增量操作符是原子的,则在进行这些操作时,它将在没有任何其他线程访问该变量的情况下读取、修改和写入这些变量。

票数 2
EN

Stack Overflow用户

发布于 2015-07-25 05:13:34

您可以使用AtomicInteger。链接的Javadoc表示(部分)它是一个可以原子更新的int值。AtomicInteger还实现了addAndGet(int),它原子地将给定的值添加到当前值中。

代码语言:javascript
运行
复制
private AtomicInteger ai = new AtomicInteger(1); // <-- or another initial value
public int increment() {
    return ai.addAndGet(1); // <-- or another increment value
}

这可以(例如)保证多个线程的写入顺序一致性。考虑一下,ai可能表示(或包括)某些static (或全局)资源。如果一个值是线程本地的,那么您不需要考虑原子性。

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

https://stackoverflow.com/questions/31623142

复制
相关文章

相似问题

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