java - 记录线程安全(Java + 注释)

标签 java annotations documentation thread-safety findbugs

我正在尝试更新一个使用依赖注入(inject)的应用程序,在这样做时,我正在尝试使用“线程安全”注释记录每个类(需要它),供其他编码人员和错误检查员使用。

如果我有服务类,如下:

@ImplementedBy(FooImpl.class)
public interface FooSrvc {

}

及其相关的实现

class FooImpl implements FooSrvc {

}

*我是否应该使用线程安全注释来记录或注释接口(interface)和具体实现?只是服务,因为它是公开的,所以只是实现?*例如对于两者:

@javax.annotation.concurrent.ThreadSafe
@org.checkthread.annotations.ThreadSafe
@ImplementedBy(FooImpl.class)
public interface FooSrvc {

}

@javax.annotation.concurrent.ThreadSafe
@org.checkthread.annotations.ThreadSafe
class FooImpl implements FooSrvc {

}

注意 - 我使用两个不同的线程安全注释集来使用较旧的并发错误查找器 CheckThread(我在其中找不到支持 jsr-305 注释的文档)和 FindBugs。

谢谢。

最佳答案

这取决于:

  • 如果您只注释接口(interface),则意思是“此接口(interface)的每个实现都保证是线程安全的。”这是一个艰难的决定,因为很难确保实现者不违反契约(Contract)。

  • 如果您只对实现进行注释,那么您就是在明确允许该接口(interface)的其他实现不是线程安全的。从治理的角度来看,这要舒服得多,但对接口(interface)的调用者来说没那么有用。

  • 注释两者是多余的,因为接口(interface)上的注释不能被实现上的注释覆盖(会违反多态性)。不过,这可能是首选选项,因为它具有更好的工具支持。

您使用的个别静态分析工具可能会要求您选择选项 3。我对 CheckThread 的了解不够深,无法发表评论。然而,FindBugs 线程安全检测器非常简陋,因此并不重要。如果 FindBugs 是您的主要工具,那么我会推荐选项 3 以及界面上的一些 Javadoc,告诉开发人员线程安全注释未强制执行,因此他们还必须检查实现以确定。

关于java - 记录线程安全(Java + 注释),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20764961/

相关文章:

java - 你如何记录匿名函数?

java - 如何将 BytesWritable 内容写入文件?

kotlin - 注释类不会将输入验证为 Kotlin 中的枚举

java - 使用 javadoc 类(在其他包中)的其他静态值的 @value

java - JAXB 忽略 XmlElement 指令

java - 由于意外异常导致 Bamboo 构建失败

performance - 为什么findAncestorWidgetOfExactType为O(N)而DependOnInheritedWidgetOfExactType为O(1)

java - 为什么 switch case 语句无法使用 Enum 的属性?

java - JProgressBar.stringPainted(true);不管用

java - URI.resolve() 不支持所有允许的文件名字符