使用 java.util.concurrent.locks.ReadWriteLock @GuardedBy annotation

对受 保护的字段进行批注的正确/首选方法是什么,以便 FindBugs 等工具可以利用该批注?是否应该简单地将名称写在注释中。是否有理由在注释中只写读锁或只写锁的名称?FindBugs或其他工具是否支持?ReadWriteLockReadWriteLock@GuardedBy@GuardedByReadWriteLock@GuardedBy


答案 1

在撰写本文时,Findbugs尚未完全实现,并且主要用于文档。(它已部分实现。@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

“查找 Bug”支持以下注释:

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

}  

推荐