web-dev-qa-db-ja.com

Java.util.concurrent.locks.ReadWriteLockを使用した@GuardedByアノテーション

FindBugsのようなツールが注釈を活用できるように、ReadWriteLockで保護されているフィールドに注釈を付けるための適切/推奨される方法は何ですか? ReadWriteLockの名前は、単に@GuardedByアノテーションで記述する必要があります。 @GuardedBy注釈に読み取りロックのみ、または書き込みロックのみの名前を書き込む理由はありますか? FindBugsや他のツールは、@GuardedByReadWriteLockをサポートしていますか?

38
Greg Mattes

この記事の執筆時点では、_@GuardedBy_ Findbugsによって完全に実装されているわけではありません であり、ほとんどがドキュメント用です。 (partially実装されています。)

私は常に@GuardedBy("readwritelock")またはsynchronizeに使用するオブジェクトを使用します。

後者の例:

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

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

    public void work() {
        synchronized(lock) {
            workWith(innards.goop());
        }
    }        
}
_
31

Find bugsは、次の注釈をサポートしています。

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

これらのGuardedByアノテーションの使用方法は次のとおりです。

@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 ); 
    }  

}  
2
Mark