2016-01-14 65 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