【问题标题】:@GuardedBy annotation with java.util.concurrent.locks.ReadWriteLock带有 java.util.concurrent.locks.ReadWriteLock 的 @GuardedBy 注释
【发布时间】:2011-12-11 03:34:38
【问题描述】:

注释受ReadWriteLock 保护的字段以便像 FindBugs 这样的工具可以利用注释的正确/首选方法是什么? ReadWriteLock 的名称是否应该简单地写在@GuardedBy 注释中。有没有理由在@GuardedBy 注释中只写读锁或写锁的名称? FindBugs 或其他工具是否甚至支持@GuardedBy 中的ReadWriteLock

【问题讨论】:

    标签: java concurrency annotations static-analysis findbugs


    【解决方案1】:

    Find bugs 支持以下注解:

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

    【讨论】:

    • 这些注解也在 JSR305 中被捕获。它们可以在这个参考实现中看到:code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/…
    • 锁的名字可以写得更简洁:@GuardedBy("readWriteLock") -- "value=" 部分不是明确要求的。
    • 我的问题并不是关于基本用法。我试图弄清楚是否应该在 @GuardedBy 注释中将包含读锁和写锁的 java.util.concurrent.locks.ReadWriteLock 称为整个 ReadWriteLock,或者由个人读写锁。以及这些是否有效。
    • @GregMattes - 如果是其中之一,请指定单独的读/写锁。否则,请指定主锁。
    【解决方案2】:

    在撰写本文时,@GuardedByisn't fully implemented by Findbugs,主要用于文档。 (它是部分实现的。)

    我总是使用@GuardedBy("readwritelock") 或我使用的对象synchronize

    以后者为例:

    class Example {
        private Object lock = new Object();
    
        @GuardedBy("lock")
        private Stuff innards = ...;
    
        public void work() {
            synchronized(lock) {
                workWith(innards.goop());
            }
        }        
    }
    

    【讨论】:

    • 谢谢!只是一个简短的说明,我不知道 FindBugs 艺术的状态(因此我问了这个问题!:),但提到注释可能未实现的链接似乎已有四年历史了。
    • 从链接到的错误跟踪器上的活动来看,该项目非常活跃。
    • 你是说 FindBugs 项目?哦,当然,它还活着,而且很好。我的意思是四年前的具体声明,可能无法实现 GuardedBy 注释。我是说最新的 FindBugs 代码可能实现了它。抱歉,如果我误读/误解了某些内容。
    • 同样,但链接仍然指向他们的错误跟踪器。如果它是 my 错误跟踪器,我会在对其进行任何更新时搜索@guardedby。但话又说回来,它不是我的错误跟踪器
    • 不幸的是,GuardedBy 注释似乎不再适用于 FindBugs。我偶然发现了这个问题(FindBugs 忽略了明显的错误)并找到了这张公开票:sourceforge.net/p/findbugs/bugs/765
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多