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