2010-05-28 18 views
6

Ben AtomicLong defalarca kullandık ama AtomicReference kullanmak için gerekli aslaAtomicReference (Java) ne zaman kullanılmalıdır? Gerçekten gerekli mi?

O AtomicReference ya (ben başka stackoverflow sorudan bu kodu kopyalanan) yaptığı görünüyor

:

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue) { 
     // someList could be changed by another thread after that compare, 
     // and before this set 
     this.someList = newValue; 
     return true; 
    } 
    return false; 
} 

Ya

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue || this.someList.equals(oldValue)) { 
     // someList could be changed by another thread after that compare, 
     // and before this set 
     this.someList = newValue; 
     return true; 
    } 
    return false; 
} 

Bu.someList'in uçucu olduğu varsayılır.

Hangisinin olduğundan emin değilim çünkü javadoc ve bu sınıfın kodu, .equals kullanıldığında açık değildir.

Yukarıdaki yöntemlerin tam olarak ne kadar zor yazıldığını görmek AtomicReference'ı hiç kimse kullanmadı mı?

+6

[Onlar] (http://www.google.com/search?q=%22import+java.util.concurrent.atomic.atomicreference%22&) hiç kullanmadı. – BalusC

cevap

11

Bu, referansı, yani karşılaştırılan şeydir. Dokümantasyon, bir kimlik karşılaştırmasının, its description. 'da bile AtomicReference ve diğer atomik sınıfları çok sık kullandığımda bile == işleminin kullanıldığını açıkça ortaya koymaktadır. Profilleme, senkronizasyonu kullanarak eşdeğer yöntemlerden daha iyi performans gösterdiğini gösterir. Örneğin, AtomicReference üzerinde bir get() işlemi, yalnızca ana bellekten getirme gerektirirken, synchronized kullanarak benzer bir işlem, önce iş parçacıkları tarafından önbelleğe alınan değerleri ana belleğe temizlemeli ve ardından getirisini gerçekleştirmelidir.

AtomicXXX sınıfları, karşılaştırma ve takas (CAS) işlemleri için yerel desteğe erişim sağlar. Temel sistem destekliyorsa, CAS, Java'da synchronized blokları ile pişirilen herhangi bir programdan daha hızlı olacaktır.

+1

Tabii ki ben bir moronum. Onun java.lang.ref Biri olsaydı AtomicObject gibi bir şey olduğunu düşünüyordum. –

+0

Bu karşılaştırmaya nasıl yorum yaparsınız: https://edgblog.wordpress.com/2013/10/01/synchronization-vs-atomicreference-test/? değerini korumak için bir 'AtomicLong' kullanarak WaldemarWosiński @ –

+0

doğrudan elma-elma karşılaştırma olacaktır bir' synchronized' bloğunda bir 'long', daha hızlı olacaktır. Nesne ayırma, bazı farklar için hesaplar, ancak bu, CAS'ta başarısız karşılaştırmalar nedeniyle yeniden denemelerle daha da kötüleşir. Eşzamanlı uygulamalarda hızı önemsiyorsanız, yan etkilerden arındırılmış işlemlere tutun ('long' veya' AtomicLong 'uygulamaları gibi). – erickson

İlgili konular