Много примеров использования ресурсов Java выглядеть следующим образом:Состояние ожидания Java-try-finally?
Resource r = openResource();
try {
// use resource
} finally {
r.close();
}
Декларация r
должна быть вне try
-clause, чтобы быть видимым в finally
-clause, но это также делает его похожим есть потенциальное состояние гонки: Что делать, если есть прерывание потока прямо между openResource()
-колл и ввод try
-clause?
Может ли это означать, что ресурс не действительно закрыт в этом сценарии?
Или Java гарантирует, что try-finally
охватывает r
«полностью», несмотря на синтаксис, похожий на него?
Или я должен написать:
Resource r = null;
try {
r = openResource();
// use resource
} finally {
if (r != null) r.close();
}
в целях защиты от резьбы прерываний?
Теоретически, да, есть проблема. На практике, однако, пока нет промежуточных утверждений, я сомневаюсь, что есть сценарий, в котором вы могли бы получить прерывание после возвращения из 'openResource' и перед входом в область' try'. Реальная экспозиция будет находиться внутри 'openResource', которая должна была быть установлена до' r' и, следовательно, вне контроля вызывающего абонента. –