java - 如何在@GuardedBy注释中使用多个互斥体?

标签 java concurrency annotations

我有一个方法,应该线程安全地对类的多个字段进行一些处理。此方法在多个循环中调用,因此我不会锁定其中的任何互斥体,但需要调用者使用 @GuardedBy 注释来锁定它们,如下所示:

@GuardedBy("this")
void foo(int x) {
    mField1 = x + mField2;
    mField2 = x;
}

但是为了让我的类(class)更快,我引入了细粒度锁定。 mField1mField2 有时会同时更新,但有时则不然,因此我为它们引入了单独的锁。如何在注释中表示此逻辑?

我尝试编写类似的代码

@GuardedBy("mField1Lock")
@GuardedBy("mField2Lock")
void foo(int x) {
    mField1 = x + mField2;
    mField2 = x;
}

但它无法编译:错误:GuardedBy 不是可重复的注释类型

最佳答案

@GuardedByJCIP (Java Concurrency In Practice) 定义的注释不允许多个互斥体。 另一个问题是JCIP没有提供检查注释的工具,而只是将它们用作文档。

Checker Framework解决了这两个问题。它的@GuardedBy注释允许多个互斥体,其 Lock Checker验证注释,警告您代码可能因无法获取锁而遭受竞争条件的任何地方。

关于java - 如何在@GuardedBy注释中使用多个互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50911769/

相关文章:

java - 使用 AspectJ 捕获参数自定义注释

java - 为什么人们继续使用 xml 映射文件而不是注释?

spring - 如何在不使用任何 XML 文件的情况下设置 Spring Web 服务?

java - 无法将字符串格式化为 Java 中的预期输出

java - 使用安卓 JNI

java - 如何指定 JFrame 内鼠标单击的坐标?

java - 如何用 Java 返回我自己的 future ?

java - String.endsWith 的 StringBuffer 替代品是什么?

ios - 如何安全地使渲染与更新模型脱钩?

java - 多线程的最佳替代方案是什么?