web-dev-qa-db-fra.com

Annotation @GuardedBy avec Java.util.concurrent.locks.ReadWriteLock

Quelle est la manière appropriée/préférée d'annoter des champs protégés par un ReadWriteLock afin que des outils comme FindBugs puissent tirer parti de l'annotation? Le nom du ReadWriteLock doit-il simplement être écrit dans le @GuardedBy annotation. Y a-t-il jamais une raison d'écrire le nom du verrou de lecture ou du verrou d'écriture dans le @GuardedBy annotation? FindBugs ou d'autres outils prennent-ils même en charge ReadWriteLock dans @GuardedBy?

38
Greg Mattes

Au moment d'écrire ces lignes, @GuardedByn'est pas entièrement implémenté par Findbugs , et est principalement destiné à la documentation. (Il est partiellement implémenté.)

J'utilise toujours @GuardedBy("readwritelock") ou l'objet que j'utilise pour synchronize.

Par exemple de ce dernier:

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

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

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

Find bugs prend en charge les annotations suivantes:

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

L'utilisation de ces annotations GuardedBy doit être la suivante:

@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