0

我从 Lock checker 那里得到了这个:

Error:(52, 30) java: [method.guarantee.violated] @ReleasesNoLocks method proc() calls method unfree() with a weaker @MayReleaseLocks side effect guarantee

我可以发布代码,但没关系。我只是不了解有关调用副作用方法的文档。

4

1 回答 1

0

您的代码如下所示:

@ReleasesNoLocks
void proc() {
  ...
  unfree();  // line 52
  ...
}

void unfree() {
  // arbitrary code that might include someLock.unlock();
}

的文档 @ReleasesNoLocks说:

该方法及其调用的所有方法都保持严格不递减的锁持有计数

方法上的@ReleasesNoLocks注释proc承诺该方法proc不会释放任何锁。但是,方法unfree可能会释放一些锁(因为它没有被注释为@ReleasesNoLocks)。如果unfree释放锁,则proc违反其规范。这就是 Lock Checker 的消息所说的(以简洁的方式)。

在运行时发生的事情有三种可能性:

  1. unfree确实释放了锁。在这种情况下,您的代码有问题,并且 Lock Checker 已经告诉您了!@ReleasesNoLocks上的注释proc是假的。您需要删除该注释或更改unfree为不释放任何锁。
  2. unfree从不释放任何锁。在这种情况下,您应该注释unfree@ReleasesNoLocks. 此时,Lock Checker 将能够验证proc的实现是否满足其规范,因此它将不再发出警告。
  3. unfree有时释放锁,有时不释放锁。您知道,主体中的特定调用proc不会释放锁。在这种情况下,您应该在源代码的第 52 行写一个@SuppressWarnings("method.guarantee.violated")注释。错误消息中出现键“method.guarantee.violated”。我建议您也添加一条注释来解释您是如何知道这一事实的,以便将来您知道为什么要编写@SuppressWarnings注释。
于 2016-09-19T22:02:00.393 回答