Как я могу вызвать метод с более слабой гарантией побочных эффектов?

Я получил это из проверки блокировки:

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

Я мог бы опубликовать код, но это не имеет значения. Я просто не понимаю документацию о вызове побочных эффектов.

1 ответ

Ваш код выглядит примерно так:

@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 не снимает блокировку В этом случае вы должны написать @SuppressWarnings("method.guarantee.violated") аннотация в строке 52 вашего исходного кода. Ключ "method.guarantee.violated" появляется в сообщении об ошибке. Я рекомендую добавить комментарий, объясняющий, как вы знаете этот факт, а также, чтобы в будущем вы знали, почему вы написали @SuppressWarnings аннотаций.
Другие вопросы по тегам