Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是对原子方法的调用_Java_Multithreading_Concurrency_Atomic - Fatal编程技术网

Java是对原子方法的调用

Java是对原子方法的调用,java,multithreading,concurrency,atomic,Java,Multithreading,Concurrency,Atomic,我真的想不出这个问题的好标题,但问题是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 a

我真的想不出这个问题的好标题,但问题是
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);
    }
  }
}

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

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


剩下的问题是“您为什么关心?”但以上是您所问问题的答案。

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

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


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

如果在调用
AtomicInteger.set
?@LouisWasserman我实际上没有走那么远;我只是好奇…原子性不是为了阻止上下文切换。这是关于确保任何线程总是看到一致的、正确的状态,不管上下文如何切换。我认为您可能误解了原子的含义。这并不意味着在通话之前或之后什么都不会发生,而是在通话的“中间”什么都不会发生。例如,如果在一个线程中执行<代码> i(0)和另一个线程中的代码> I. SET(-1),您将看不到具有0和1的其他位——也就是说,它永远不会像一个线程在另一个线程的中间写下1s。我只是好奇这里发生了什么,也就是说,如果调用了一个方法,而该方法是一个原子操作,那么整个方法调用会是原子的吗?如果线程在调用
AtomicInteger.set
?@LouisWasserman我实际上没有走那么远;我只是好奇…原子性不是为了阻止上下文切换。这是关于确保任何线程总是看到一致的、正确的状态,不管上下文如何切换。我认为您可能误解了原子的含义。这并不意味着在通话之前或之后什么都不会发生,而是在通话的“中间”什么都不会发生。例如,如果在一个线程中执行<代码> i(0)和另一个线程中的代码> I. SET(-1),您将看不到具有0和1的其他位——也就是说,它永远不会像一个线程在另一个线程的中间写下1s。我只是好奇这里发生了什么,也就是说,如果调用了一个方法,而该方法是一个原子操作,那么整个方法调用会是原子的吗?至于我为什么在乎,“好奇心害死了猫,但满足感又把它带回来了”一个比“你为什么在乎?”更有趣的问题是“你怎么知道?”原子性是关于可观察的结果:你会看到什么,你不会说什么,你可能会看到什么?如果两个场景对这些问题有相同的答案,那么从原子性的角度来看,它们是相同的场景。性能特征可能会有所不同,但这是一个不同的问题。至于我为什么关心,“好奇心杀死了猫,但满足感让它回来了”一个比“你为什么关心?”更有趣的问题是“你怎么会知道?”原子性是关于可观察到的结果:你会看到什么,你不会说什么,你可能会看到什么?如果两个场景对这些问题有相同的答案,那么从原子性的角度来看,它们是相同的场景。性能特征可能不同,但这是一个不同的问题。