2016-05-28 90 views
0

真正的原子是什麼?因爲我必須選擇一些語言來更清晰地構建我的問題,所以我會選擇Java。我知道,原子意味着做所有事情,或者只是回滾/無所事事。所以說,我有以下原子是什麼?

public class Myclass { 

    private boolean progress; 

    public void setProgress(boolean progress) { 
     this.progress = progress; 
    } 

    public boolean getProgress() { 
     return progress; 
    } 

} 

現在以下哪些是線程安全的或原子或兩者兼而有之?請把每一個新行作爲一個單獨的代碼

 ------------------- 
    getProgress(); // 
    ------------------ 

    ---------------------- 
    setProgress(true); // 
    ---------------------- 

    ------------------- 
    getProgress() 
    setProgress(); 
    ------------------- 

    -------------------- 
    setProgress(); 
    getProgress(); 
    -------------------- 

哪些這些情況下將有意義在java中使用AtomicReference?

+0

由於'progress'不是'volatile',因此該類不是線程安全的。完成後,該類應該是線程安全的。 – Turing85

+0

至於原子操作:[關於原子訪問的Oracle教程](https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)恰恰定義了兩個原子操作:讀取和寫入任何原語字段和引用字段,除了'long'和'double',以及'volatile'字段上的讀取和寫入。 – Turing85

+0

@ Turing85,'AtomicXxxxxxx'類除了這兩個之外還有一些額外的原子操作。例如,'atomic.compareAndSet(expected,new)'測試變量是否等於'expected',如果是,則將它設置爲'new',全部在一個原子步驟中。 –

回答

2

從這:

What operations in Java are considered atomic?

我會說他們都不是原子,因爲函數調用是不是一個原子操作。但是,一旦你在一個函數中,分配一個布爾值是原子的(就是這一行),返回它不是。

爲了線程安全來看看這個:

Are java getters thread-safe?

基本的「進步」也許緩存的CPU內,因此即使分配一個新的值是原子(只是=行的舊值再次)沒有同步賦值(AtomicBoolean或同步getter/setter)它是線程安全的,但是可能會存在內存一致性錯誤,因此您可能想聲明該變量volatile,以便其他線程可以看到最新的值。

+0

你完全忽略了關於線程安全的問題。 – Turing85

+0

擴大一點。隨時編輯。 – Reek