Является ли неблокирующий алгоритм применимым для вставки и удаления ИЛИ только для некоторых условий, таких как отсутствие доступного пространства / отсутствие элементов для использования - PullRequest
0 голосов
/ 04 мая 2018

В некоторых блогах упоминается, что неблокирующий алгоритм Data Structures не будет блокировать вызывающие потоки, если нет места / элемента для добавления / использования. Они немедленно возвращаются с исключением или нулем. Но нигде я не нашел, как работает вставка / удаление в неблокирующих алгоритмах.

1 Ответ

0 голосов
/ 04 мая 2018

Могут потребоваться другие операции, когда условие не выполняется. Существует четыре типичных формы:

  • бросить исключение
  • вернуть специальное значение
  • блок
  • тайм-аут

Для неблокирующей реализации могут произойти первые два.

См. Документ BlockingQueue:

Очередь, которая дополнительно поддерживает операции, ожидающие очередь стать непустым при извлечении элемента и ждать места для стать доступным в очереди при хранении элемента.

Методы BlockingQueue бывают четырех видов, с различными способами обработка операций, которые не могут быть выполнены немедленно, но могут быть удовлетворены в какой-то момент в будущем: каждый бросает исключение, секунда возвращает специальное значение (ноль или ложь, в зависимости от операция), третий блокирует текущий поток на неопределенный срок до операция может быть успешной, и четвертый блок только для заданного максимума ограничение по времени, прежде чем сдаться. Эти методы обобщены в следующая таблица:

         Throws exception   Special value   Blocks           Times out
Insert   add(e)             offer(e)        put(e)           offer(e, time, unit)
Remove   remove()           poll()          take()           poll(time, unit)
Examine  element()          peek()          not applicable   not applicable
...