2010-11-18 17 views
4

Brian Goetz tarafından JCIP okuyordum. CAS talimatını kullanarak bloke olmayan bir sayacın uygulanmasını açıklar. CAS komutunu kullanarak artışın nasıl olduğunu anlayamadım. Bunu anlamama yardım eden var mı? Başka kimse ise sayacın geçerli değerini alırCAS ve Sigara Engelleme Sayacı

int old = value.val; 
if (old == v) { 
    value.val = v + 1; 
} 
return old; 
Şimdi

v = value.get() (detaylar için compare-and-swap bakın) ve:

public class CasCounter { 
    private SimulatedCAS value; 

    public int getValue() { 
     return value.get(); 
    } 

    public int increment() { 
     int v; 
     do { 
      v = value.get(); 
     } 
     while (v != value.compareAndSwap(v, v + 1)); 
     return v + 1; 
    } 
} 

cevap

4

value.compareAndSwap(v, v + 1) tüm blok atomik olması dışında, aşağıda eşdeğerdir Sayacı aynı anda güncelleştirmeye çalışırken, old == v doğru olacaktır, bu nedenle değer v+1 olarak ayarlanır (yani artırılır) ve old döndürülür. Döngü v == old'dan beri sona erer.

varsayalım başkasının biz v = value.get() tıpkı sonra sayaç artırılır, sonra old == v yanlış olurdu ve yöntem hemen güncellenir değeri olan old, dönecektir. Artık v != old, döngü devam ediyor.

3

compareAndSwap() yöntem atomik aşağıdaki işlemleri gerçekleştirir: Arayan value onlar compareAndSwap() çağrıldığında olmasını beklediğim olup olmadığını görmek için kontrol edebilirsiniz

- determine if `value` is equal to `v` 
- if so, it will set `value` to `v+1` 
- it returns whatever `value` was when the method was entered (whether or not `value` was updated) 

. Öyleyse, arayan kişi güncellendiğini biliyor. Beklenenin olmaması durumunda, arayan kişi güncellemediğini bilir ve yeniden denemek üzere 'yeni' geçerli değerini value kullanarak beklendiği gibi kullanır (döngü budur).

Bu şekilde, arayan kişi, artırım işleminin aynı anda value'u değiştirmeye çalışan başka bir iş parçacığı tarafından kaybolacağını bilebilir.