2011-10-19 5 views
36

ReadWriteLock से सुरक्षित फ़ील्ड को एनोटेट करने के लिए उचित/पसंदीदा तरीका क्या है ताकि FindBugs जैसे टूल एनोटेशन का लाभ उठा सकें? ReadWriteLock का नाम बस @GuardedBy एनोटेशन में लिखा जाना चाहिए। @GuardedBy एनोटेशन में केवल पढ़ने के लॉक का नाम लिखने का कोई कारण है, या सिर्फ लिखने का ताला है? क्या FindBugs, या अन्य टूल्स, ReadWriteLock@GuardedBy में भी समर्थन करते हैं?@ guarded java.util.concurrent.locks.ReadWriteLock

उत्तर

28

इस लेखन के समय, @GuardedByisn't fully implemented by Findbugs, और ज्यादातर बस के लिए है:

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

इन GuardedBy एनोटेशन का उपयोग इस प्रकार होना चाहिए प्रलेखन। (यह आंशिक रूप से लागू किया है।)

मैं हमेशा @GuardedBy("readwritelock") या वस्तु है कि मैं synchronize करने के लिए उपयोग का उपयोग करें।

बाद के उदाहरण के लिए:

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

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

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

धन्यवाद! बस एक त्वरित नोट, मुझे FindBugs कला की स्थिति नहीं पता है (इसलिए मैंने इस सवाल से पूछा! :), लेकिन यह लिंक जो उल्लेख करता है कि एनोटेशन लागू नहीं किया जा सकता है, वह चार साल का है। –

+0

वह प्रोजेक्ट बहुत सक्रिय है, जो लिंक-टू-बग-ट्रैकर पर गतिविधि द्वारा निर्णय लेता है। –

+0

आपका मतलब FindBugs प्रोजेक्ट है? ओह यकीन है, यह जिंदा और अच्छी तरह से है। मेरा मतलब चार साल पहले से विशिष्ट बयान था कि संरक्षित एनोटेशन लागू नहीं किया जा सकता है। मैं कह रहा हूं कि सबसे हालिया FindBugs कोड इसे कार्यान्वित कर सकता है। क्षमा करें अगर मैंने कुछ गलत/गलत समझा। –

2

ढूँढें कीड़े निम्नलिखित एनोटेशन समर्थन करता है:

@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

ये टिप्पणियां भी JSR305 में कब्जा कर रहे हैं। इन संदर्भ कार्यान्वयन में उन्हें देखा जा सकता है: http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/concurrent/ –

+3

का नाम लॉक को इस तरह अधिक कॉम्पैक्टली लिखा जा सकता है: @GuardedBy ("readWriteLock") - "value =" भाग स्पष्ट रूप से आवश्यक नहीं है। –

+1

मेरा प्रश्न वास्तव में मूल उपयोग के बारे में नहीं है। मैं यह पता लगाने की कोशिश कर रहा हूं कि java.util.concurrent.locks.ReadWriteLock, जिसमें एक रीड लॉक और एक लिखने वाली लॉक दोनों शामिल हैं, को @GuardedBy एनोटेशन में पूरे ReadWriteLock के रूप में संदर्भित किया जाना चाहिए, या व्यक्ति द्वारा पढ़ और लिखना ताले। और क्या इनमें से कोई भी प्रभावी है। –