аннотация @GuardedBy с помощью java.util.concurrent.блокировки.ReadWriteLock

#java #concurrency #annotations #static-analysis #findbugs

#java #параллелизм #аннотации #статический анализ #поиск ошибок

Вопрос:

Каков правильный / предпочтительный способ аннотирования полей, защищенных с помощью a ReadWriteLock , чтобы такие инструменты, как FindBugs, могли использовать аннотацию? Должно ли имя ReadWriteLock просто быть записано в @GuardedBy аннотации. Есть ли когда-нибудь причина для записи имени только блокировки чтения или только блокировки записи в @GuardedBy аннотации? Поддерживает ли FindBugs или другие инструменты даже ReadWriteLock in @GuardedBy ?

Ответ №1:

На момент написания этой статьи @GuardedBy не полностью реализован Findbugs и в основном предназначен только для документации. (Это частично реализовано.)

Я всегда использую @GuardedBy("readwritelock") или объект, который я использую synchronize .

Например, последнее:

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

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

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

Комментарии:

1. Спасибо! Просто небольшое замечание, я не знаю состояния FindBugs art (поэтому я задал этот вопрос! :), но ссылке, в которой упоминается, что аннотация может быть не реализована, по-видимому, четыре года.

2. Этот проект очень активен, судя по активности в связанном баг-трекере.

3. Вы имеете в виду проект FindBugs? О, конечно, он жив и здоров. Я имел в виду конкретное утверждение четырехлетней давности о том, что аннотация GuardedBy может быть не реализована. Я говорю, что самый последний код FindBugs может реализовать это. Извините, если я что-то неправильно понял / неправильно понял.

4. Аналогично, но ссылка по-прежнему связана с их средством отслеживания ошибок. Если бы это был мой баг-трекер, я бы искал @guardedby, когда делал какие-либо обновления для него. Но опять же, это не мой баг-трекер

5. К сожалению, похоже, что аннотация GuardedBy больше не работает в FindBugs. Я наткнулся на эту проблему (FindBugs игнорирует очевидные ошибки) и нашел этот открытый билет: sourceforge.net/p/findbugs/bugs/765

Ответ №2:

Поиск ошибок поддерживает следующие аннотации:

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

}  
  

Комментарии:

1. Эти аннотации также записываются в JSR305. Их можно увидеть в этой эталонной реализации: code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java /…

2. Имя блокировки может быть записано более компактно следующим образом: @GuardedBy(«ReadWriteLock») — часть «value =» явно не требуется.

3. Мой вопрос на самом деле не о базовом использовании. Я пытаюсь выяснить, является ли java.util.concurrent . блокировки. ReadWriteLock, который содержит как блокировку чтения, так и блокировку записи, должен упоминаться в аннотации @GuardedBy как полная блокировка чтения или отдельные блокировки чтения и записи. И является ли что-либо из этого эффективным.

4. @GregMattes — если один или другой, укажите отдельную блокировку чтения / записи. В противном случае укажите главную блокировку.