#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 — если один или другой, укажите отдельную блокировку чтения / записи. В противном случае укажите главную блокировку.