我无法真正想到这个问题的优秀标题,但问题是以下对Atomic.set
构造函数中Foo
的调用是原子的,还是线程可以切换之前致电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);
}
}
}
答案 0 :(得分:4)
在Java语言规范或Java虚拟机规范中无法保证在调用方法本身和调用atomic.set()
内部之间没有其他线程运行。
这完全取决于JVM,您的硬件等。如果您有多个CPU,其他CPU甚至不知道代码中的一个CPU在哪里,除非您在Java中使用线程同步功能。 (您没有这样做,至少不在您的方法开头添加atomic.set
的调用之后)
留下了“你为什么关心?”的问题。但以上是你提出的问题的答案。