是否允许JVM重新排序AtomicInteger调用的指令

Ged*_*rox 3 java concurrency multithreading jvm atomicinteger

是否可以安全地假设之前的代码(AtomicInteger a).addAndGet(-1)将始终在此调用之前执行,即JVM 不会addAndGet调用周围的指令重新排序?

如果是,是否可以安全地假设检查同一AtomicInteger实例状态的其他线程(例如if (a.compareAndSet(0, -1)))将在addAndGet调用之前看到第一个线程已更改的所有内容?

Joh*_*int 6

是否可以安全地假设之前的代码(AtomicInteger a).addAndGet(-1)将始终在此调用之前执行,即JVM不会对addAndGet调用周围的指令重新排序?

恩,那就对了.该addAndGet会发出易失性存储器(或类似),因此其他加载和存储不能在其下方进行重新排序.

编辑:感谢Soitrios链接https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html,这表明有一个订购的建立.

  • get具有读取volatile变量的记忆效应.
  • set具有写入(赋值)volatile变量的记忆效应.
  • compareAndSet和所有其他读取和更新操作(如getAndIncrement)都具有读取和写入volatile变量的内存效果.