2016-01-14 64 views
1

我真的不能想到这个问题的一个伟大的标题,但问题是以下呼吁Atomic.setFoo构造函数是原子,或者可能在调用之前线程切换到AtomicInteger.setJava是调用原子方法原子

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); 
    } 
    } 
} 
+2

如果线程在调用“AtomicInteger.set”之前切换,会出现什么问题? –

+1

@LouisWasserman我实际上并没有那么远;只是好奇... – Eliezer

+6

原子性不是关于防止上下文切换。这是关于确保任何线程总是看到一致的,正确的状态,尽管上下文切换。 –

回答

4

有一个在Java语言规范和Java虚拟机规范不能保证有方法本身的调用和atomic.set()里面调用运行之间没有其他线程。

这一切都取决于JVM,硬件等。如果您有多个CPU,除非您使用Java中的线程同步功能,否则其他CPU不会知道代码中的一个CPU。 (你不这样做,至少不是在你的方法开始之间加入atomic.set的调用)

留下的问题是“你为什么在意?”但以上是你问的问题的答案。

+0

至于我为什么在意,“好奇心杀死了猫,但满意度将它带回“ – Eliezer

+3

一个比”你为什么在意?“更有趣的问题?是“你怎么知道?”原子性是可观察的结果:你会看到什么,你不会说什么,你会看到什么?如果两个场景对这些问题有相同的答案,那么从原子性的角度来看,他们是相同的场景。 _performance_特性可能会有所不同,但这是一个不同的问题。 – yshavit