Поток открывает ресурс, что является блокирующей операцией. Если и однажды это удалось, поток должен снова закрыть его, что снова блокирует, но всегда завершается успешно за конечное время.
Можно использовать флаг (назовем его hasResource
), который никак нельзя синхронизировать с другими потоками, чтобы указать, что поток не хочет прерываться. Никакая другая синхронизация вообще не допускается.
Является ли следующий безопасным способом справиться с этим сценарием?
@Override // we're subclassing Thread
public void run () {
try {
while (!interrupted ()) {
blockingOpen ();
// glitch possibility in this line
hasResource = true;
blockingClose ();
hasResource = false;
}
}
catch (final InterruptedException e) {
interrupt ();
}
}
В частности, гарантирует ли это, что поток не будет прерван, пока у него есть ресурс?
Насколько я могу судить, есть только одно окно возможности ошибки, сразу после открытия и перед установкой флажка. Однако похоже, что это привело бы не к утечке ресурса, а к случайному игнорированию запроса на прерывание. Можно ли это предотвратить?