【问题标题】:Java Are Calls to an Atomic Method AtomicJava 是对原子方法的调用
【发布时间】:2016-01-14 07:00:31
【问题描述】:

我真的想不出这个问题的好标题,但问题是Foo 构造函数中对Atomic.set 的以下调用是否是原子的,或者线程是否可以在调用AtomicInteger.set 之前切换?

public class Foo {
  private final Atomic atomic = new Atomic();

  public Foo() {
    atomic.set(10);
  }

  private static class Atomic {
    private final AtomicInteger atomicInt = new AtomicInteger();

    public void set(int i) {
      atomicInt.set(i);
    }
  }
}

【问题讨论】:

  • 如果线程在调用AtomicInteger.set之前切换会出现什么问题?
  • @LouisWasserman 我实际上并没有那么远;只是好奇...
  • 原子性不是为了防止上下文切换。这是为了确保任何线程始终看到一致、正确的状态,尽管上下文切换。
  • 我想你可能误解了原子的意思。这并不意味着在通话之前或之后不会发生任何事情——而是在通话的“中间”不会发生任何事情。例如,如果您在一个线程中执行i.set(0) 而在另一个线程中执行i.set(-1),您将不会看到一些位为 0 而其他位为 1——也就是说,它永远不会看起来像一个线程写了 0在另一个写 1 的线程中间。
  • @JBNizet + yshavit,我明白原子的意思,我只是好奇这里发生了什么,即如果调用了一个方法,并且该方法是一个原子操作,整个方法会调用吗是原子的?

标签: java multithreading concurrency atomic


【解决方案1】:

Java 语言规范或 Java 虚拟机规范不保证在调用方法本身和调用其中的 atomic.set() 之间没有其他线程在运行。

这完全取决于 JVM、您的硬件等。如果您有多个 CPU,其他 CPU 甚至都不知道一个 CPU 在代码中的位置,除非您使用 Java 中的线程同步功能。 (你没有这样做,至少没有在你的方法开始之间添加atomic.set的调用)

剩下的问题是“你为什么在乎?”但以上是您所提问题的答案。

【讨论】:

  • 至于为什么我在乎,“好奇害死猫,但满足又回来了”
  • 一个比“你为什么关心?”更有趣的问题。是“你怎么知道?”原子性是关于可观察的结果:你会看到什么,你不会说什么,你可能会看到什么?如果两个场景对这些问题有相同的答案,那么从原子性的角度来看,它们是相同的场景。 性能特性可能不同,但这是一个不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多