2013-05-12 170 views
2

我去了在非阻塞-CAS一篇文章,遇到了這個代碼:Java中的非阻塞CAS是否真的非阻塞?

public class SimulatedCAS { 
    private int value; 

    public synchronized int getValue() { 
    return value; 
    } 

    public synchronized int compareAndSwap(int expectedValue, int newValue) { 
    int oldValue = value; 
    if (value == expectedValue) 
     value = newValue; 
    return oldValue; 
    } 
} 

這是怎麼CAS操作非阻塞,如果它使用的同步?

如果我們的意思是這個SimulatedCAS的客戶端不需要實現自己的同步,那麼我們是不是已經將阻塞移動了而不是消除它?

+1

這是如何「非阻塞?」兩種方法都是「同步的」,這意味着兩個呼叫不能同時發生。 – 2013-05-12 15:49:03

+3

你能發表一篇文章鏈接嗎? – 2013-05-12 15:55:33

+0

原始來源似乎是「實踐中的Java併發」(第322頁)(15.2.1) – kryger 2013-05-12 16:19:34

回答

3

請注意,這是一個模擬 CAS(顧名思義本身暗示);在布賴恩戈茨的話(上市來源於他的「Java併發編程實踐」一書)

SimulatedCAS清單15.1說明CAS的語義(但不執行或性能)。

實際實現CAS的需要CPU支持,從java.util.concurrent.atomic包呼叫native方法的類。