2011-10-19 21 views
36

ReadWriteLock ile korunan alanlara açıklama eklemek için uygun/tercih edilen bir yol nedir, böylece FindBugs gibi araçlar ek açıklamalardan yararlanabilir? ReadWriteLock'un adı, @GuardedBy ek açıklamasında yazılmalıdır. @GuardedBy ek açıklamasında sadece okuma kilidini veya sadece yazma kilidini yazmak için bir neden var mı? FindBugs veya başka araçlar, 'da ReadWriteLock'u bile destekliyor mu?@GuardedBy ek açıklaması ile java.util.concurrent.locks.ReadWriteLock

cevap

28

, @GuardedByisn't fully implemented by Findbugs ve sadece için çoğunlukla şu şekildedir: bu GuardedBy ek açıklama

net.jcip.annotations.GuardedBy 
net.jcip.annotations.Immutable 
net.jcip.annotations.NotThreadSafe 
net.jcip.annotations.ThreadSafe 

Kullanımı olmalıdır dokümantasyon. (Bu kısmen uygulanan içindir.)

hep @GuardedBy("readwritelock") ya da synchronize kullanmak nesne kullanın. ikinci Örneğin

:

class Example { 
    private Object lock = new Object(); 

    @GuardedBy("lock") 
    private Stuff innards = ...; 

    public void work() { 
     synchronized(lock) { 
      workWith(innards.goop()); 
     } 
    }   
} 
+2

Teşekkürler! Sadece hızlı bir not, FindBugs sanatının durumunu bilmiyorum (bu yüzden bu soruyu sordum! :), ancak ek açıklamaların uygulanamayacağından bahsetmiş olan bağlantı dört yaşında görünüyor. –

+0

Bu proje son derece aktiftir ve bağlantılı hata izleyicisindeki etkinliğe göre değerlendirilir. –

+0

FindBugs projesini mi kastediyorsunuz? Tabii ki, hayatta ve iyi. Dört yıl önce GuardedBy ek açıklamasının uygulanamayacağı belli bir ifadeyi kastettim. En yeni FindBugs kodunun bunu uygulayabileceğini söylüyorum. Bir şeyi yanlış anladığım/yanlış anladığım için özür dilerim. –

2

Bul böcek aşağıdaki ek açıklamaları destekler: Bu yazının yazıldığı zamanda

@ThreadSafe 
public class Queue<E> implements java.util.Queue<E> 
{ 
    private ConcurrentLinkedQueue readWriteLock; 

    @GuardedBy(value="readWriteLock") 
    public boolean offer(E o) 
    { 
     return queue.offer(o); 
    } 

} 
+0

Bu ek açıklamalar da JSR305 yakalanır. Bu referans uygulamasında görülebilirler: http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/concurrent/ –

+3

Bu şekilde daha kompakt bir şekilde yazılabilir: @GuardedBy ("readWriteLock") - "value =" kısmı açık bir şekilde gerekli değildir. –

+1

Sorum şu temel kullanımla ilgili değil. Ben bir read lock ve bir yazma kilidi içeren bir java.util.concurrent.locks.ReadWriteLock, tüm ReadWriteLock olarak bir @GuardedBy ek açıklamada, veya bireysel okuma ve yazma olarak atıfta bulunup bulunmayacağını anlamaya çalışıyorum kilitler. Ve bunlardan herhangi birinin etkili olup olmadığı. –

İlgili konular