我实在想不出这个问题的好标题,但问题是在 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 中的线程同步功能。 (您没有这样做,至少没有在方法的开头添加 atomic.set
的调用)
剩下的问题是“你为什么关心?”但以上是对您提出的问题的回答。
关于Java 是对原子方法的调用 Atomic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783466/