【问题标题】:How can I call a method with weaker side effect guarantee?如何调用副作用保证较弱的方法?
【发布时间】:2016-09-19 19:24:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: checker-framework


    【解决方案1】:

    您的代码如下所示:

    @ReleasesNoLocks
    void proc() {
      ...
      unfree();  // line 52
      ...
    }
    
    void unfree() {
      // arbitrary code that might include someLock.unlock();
    }
    

    文档 @ReleasesNoLocks 说:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多