我有一个方法应该对该类的多个字段进行线程安全地处理。在多个循环中调用此方法,因此我不锁定其中的任何互斥锁,而是要求调用者使用@GuardedBy批注将其锁定,如下所示:

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


但是为了使我的课程更快,我引入了一个细粒度的锁定。 mField1mField2有时会同时更新,但有时不会同时更新,因此我为它们引入了单独的锁。如何在注释中表示此逻辑?

我尝试编码类似

@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验证批注,警告您任何地方由于无法获取锁而导致代码遭受竞争的情况。

10-06 05:41