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
?
Au moment d'écrire ces lignes, @GuardedBy
n'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());
}
}
}
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 );
}
}