我有一个方法,应该线程安全地对类的多个字段进行一些处理。此方法在多个循环中调用,因此我不会锁定其中的任何互斥体,但需要调用者使用 @GuardedBy
注释来锁定它们,如下所示:
@GuardedBy("this")
void foo(int x) {
mField1 = x + mField2;
mField2 = x;
}
但是为了让我的类(class)更快,我引入了细粒度锁定。 mField1
和 mField2
有时会同时更新,但有时则不然,因此我为它们引入了单独的锁。如何在注释中表示此逻辑?
我尝试编写类似的代码
@GuardedBy("mField1Lock")
@GuardedBy("mField2Lock")
void foo(int x) {
mField1 = x + mField2;
mField2 = x;
}
但它无法编译:错误:GuardedBy 不是可重复的注释类型
。
最佳答案
@GuardedBy
由 JCIP (Java Concurrency In Practice) 定义的注释不允许多个互斥体。
另一个问题是JCIP没有提供检查注释的工具,而只是将它们用作文档。
Checker Framework解决了这两个问题。它的@GuardedBy
注释允许多个互斥体,其 Lock Checker验证注释,警告您代码可能因无法获取锁而遭受竞争条件的任何地方。
关于java - 如何在@GuardedBy注释中使用多个互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50911769/