我有一个方法应该对该类的多个字段进行线程安全地处理。在多个循环中调用此方法,因此我不锁定其中的任何互斥锁,而是要求调用者使用@GuardedBy
批注将其锁定,如下所示:
@GuardedBy("this")
void foo(int x) {
mField1 = x + mField2;
mField2 = x;
}
但是为了使我的课程更快,我引入了一个细粒度的锁定。
mField1
和mField2
有时会同时更新,但有时不会同时更新,因此我为它们引入了单独的锁。如何在注释中表示此逻辑?我尝试编码类似
@GuardedBy("mField1Lock")
@GuardedBy("mField2Lock")
void foo(int x) {
mField1 = x + mField2;
mField2 = x;
}
但是它不能编译:
error: GuardedBy is not a repeatable annotation type
。 最佳答案
@GuardedBy
定义的JCIP (Java Concurrency In Practice)批注不允许多个互斥体。
另一个问题是,JCIP不提供检查注释的工具,而仅将其用作文档。
Checker Framework解决了这两个问题。它的@GuardedBy
批注允许多个互斥,并且它的Lock Checker验证批注,警告您任何地方由于无法获取锁而导致代码遭受竞争的情况。