我从 Lock checker 那里得到了这个:
Error:(52, 30) java: [method.guarantee.violated] @ReleasesNoLocks method proc() calls method unfree() with a weaker @MayReleaseLocks side effect guarantee
我可以发布代码,但没关系。我只是不了解有关调用副作用方法的文档。
我从 Lock checker 那里得到了这个:
Error:(52, 30) java: [method.guarantee.violated] @ReleasesNoLocks method proc() calls method unfree() with a weaker @MayReleaseLocks side effect guarantee
我可以发布代码,但没关系。我只是不了解有关调用副作用方法的文档。
您的代码如下所示:
@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 的消息所说的(以简洁的方式)。
在运行时发生的事情有三种可能性:
unfree
确实释放了锁。在这种情况下,您的代码有问题,并且 Lock Checker 已经告诉您了!@ReleasesNoLocks
上的注释proc
是假的。您需要删除该注释或更改unfree
为不释放任何锁。unfree
从不释放任何锁。在这种情况下,您应该注释unfree
为@ReleasesNoLocks
. 此时,Lock Checker 将能够验证proc
的实现是否满足其规范,因此它将不再发出警告。unfree
有时释放锁,有时不释放锁。您知道,主体中的特定调用proc
不会释放锁。在这种情况下,您应该在源代码的第 52 行写一个@SuppressWarnings("method.guarantee.violated")
注释。错误消息中出现键“method.guarantee.violated”。我建议您也添加一条注释来解释您是如何知道这一事实的,以便将来您知道为什么要编写@SuppressWarnings
注释。