Java 是对原子方法的调用 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 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/

相关文章:

java - 次要垃圾收集如何跳过老一代?

java - Lambda 与 SNS -> SQS AWS

java - 如何在不安装 jdk 或 jre 的情况下运行 java 应用程序文件(exe 而不是 jar)

调用 select() 时,Java 线程在向选择器注册 channel 时阻塞。该怎么办?

java - 使用 java 线程间在控制台中进行文件传输

mysql - 并行查询 - SELECT 和 UPDATE - 选择太快或更新太慢问题

java - 从文件系统读取文件时的并发性

java - 使用 getNodeValue() 获取文本和内联元素

python - 处理大量线程和数据库连接 (Python) 我可以做些什么来节省资源?

java - 什么时候应该使用 CompletionService 而不是 ExecutorService?