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。我只是好奇这里发生了什么,也就是说,如果调用了一个方法,而该方法是一个原子操作,那么整个方法调用会是原子的吗?至于我为什么在乎,“好奇心害死了猫,但满足感又把它带回来了”一个比“你为什么在乎?”更有趣的问题是“你怎么知道?”原子性是关于可观察的结果:你会看到什么,你不会说什么,你可能会看到什么?如果两个场景对这些问题有相同的答案,那么从原子性的角度来看,它们是相同的场景。性能特征可能会有所不同,但这是一个不同的问题。至于我为什么关心,“好奇心杀死了猫,但满足感让它回来了”一个比“你为什么关心?”更有趣的问题是“你怎么会知道?”原子性是关于可观察到的结果:你会看到什么,你不会说什么,你可能会看到什么?如果两个场景对这些问题有相同的答案,那么从原子性的角度来看,它们是相同的场景。性能特征可能不同,但这是一个不同的问题。