2013-05-12 4 views
2

я собирался через статью о неблокируемому CAS и наткнулся на этот код:Неблокирующий CAS в Java действительно не блокирует?

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

Как это «не блокирует»? Оба метода «синхронизированы», что означает, что два вызова не могут выполняться одновременно. –

+3

Можете ли вы разместить ссылку на статью? –

+0

Исходный источник кажется «Java Concurrency In Practice», стр. 322 (15.2.1) – kryger

ответ

3

Обратите внимание, что это моделируется CAS (как следует из названия); в словах Брайана Гетца (листинг исходит от его «Java Параллелизм на практике» книга):

SimulatedCAS в листинге 15.1 иллюстрирует семантику (но не реализации или исполнения) КАН.

Фактическая реализация CAS нуждается в поддержке процессора, классы от java.util.concurrent.atomic пакета вызова native методы.