Можно ли вообще надежно использовать ReentrantLock.hasQueuedThreads()?JAVA

Программисты JAVA общаются здесь
Anonymous
Можно ли вообще надежно использовать ReentrantLock.hasQueuedThreads()?

Сообщение Anonymous »

В документации Java для ReentrantLock.hasQueuedThreads() говорится следующее:

Обратите внимание: поскольку отмена может произойти в любое время, истинное возвращение не гарантирует, что какой-либо другой поток когда-либо получит эту блокировку. Этот метод предназначен в первую очередь для мониторинга состояния системы.

Я понимаю, что небезопасно полагаться на возвращаемое значение hasQueuedThreads()< /code>, если другие потоки могут вызывать, например. lockInterruptible() или tryLock(timeout), но применимо ли это предупреждение, даже если я могу гарантировать, что все потоки будут вызывать только lock()?

Проблема, которая привела меня к этому вопросу, заключается в следующем: у меня есть несколько потоков, которым, возможно, придется взаимодействовать с внешним устройством. Перед тем, как к нему можно будет получить доступ, это устройство необходимо включить, но по возможности его следует переводить в режим сна, чтобы сохранить заряд батареи. Итак, я бы хотел, чтобы потоки имели следующее поведение:
  • Каждый раз, когда поток хочет получить доступ к устройству, он получает блокировку (с помощью lock()< /code>).
  • После получения блокировки поток при необходимости включает устройство, а затем делает то, что должен.
  • После завершения потока он проверяет, ожидает ли какой-либо другой поток блокировки. Если да, то устройство остается включенным, если нет, то оно выключается.
Конечно, для надежной работы мне нужен lock.hasQueuedThreads (), чтобы быть надежным индикатором того, возьмет ли другой поток на себя ответственность за выключение устройства.
Другая конструкция, которую я рассматривал, заключается в том, что все потоки будут отправлять свои рабочие нагрузки в один поток драйвера, но это похоже на вход в ад обратного вызова, поэтому я бы предпочел туда не ходить 🙈

Подробнее здесь: https://stackoverflow.com/questions/790 ... bly-at-all

Вернуться в «JAVA»