我有一个方法应该线程安全地对类的多个字段进行一些处理。这个方法在多个循环中调用,因此我不会锁定其中的任何互斥锁,但需要调用者使用@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;
}
但它没有编译:{{1}}。
答案 0 :(得分:1)
由@GuardedBy
定义的JCIP (Java Concurrency In Practice)批注不允许多个互斥体。
另一个问题是,JCIP没有提供检查批注的工具,而只是将其用作文档。
Checker Framework解决了这两个问题。其@GuardedBy
批注允许多个互斥,并且其Lock Checker验证批注,警告您任何地方由于未能获取锁而导致代码遭受竞争的情况。