如何在@GuardedBy注释中使用多个互斥锁?

时间:2018-06-18 14:29:23

标签: java concurrency annotations

我有一个方法应该线程安全地对类的多个字段进行一些处理。这个方法在多个循环中调用,因此我不会锁定其中的任何互斥锁,但需要调用者使用@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;
}

但它没有编译:{{1​​}}。

1 个答案:

答案 0 :(得分:1)

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

Checker Framework解决了这两个问题。其@GuardedBy批注允许多个互斥,并且其Lock Checker验证批注,警告您任何地方由于未能获取锁而导致代码遭受竞争的情况。