2016-10-24 5 views
4

Я столкнулся с этой строкой, которая гласит: «Однако, несмотря на то, что все операции являются потокобезопасными, операции поиска не влекут за собой блокировку, и нет никакой поддержки для блокировки всей таблицы таким образом, чтобы предотвратить весь доступ» в общее описание класса Java [ConcurrentHashMap] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html). Мой вопрос: означает ли это, что ConcurrentHasMap не предотвращает мертвую блокировку? Кроме того, я думал, что с точки зрения потолка подразумевается, что мертвый замок не будет иметь места?Нить безопасна, но не предотвращает тупик?

+1

Операции над ConcurrentHashMap не вызывают взаимоблокировки - и, надеюсь, никто не будет маркировать кусок кода как потокобезопасный, если это может вызвать тупик. – nos

+0

Спасибо для быстрой обратной связи и примите! – GhostCat

+0

@nos: Это не так просто. В Java 8 «ConcurrentHashMap» предлагает методы «compute ...», которые позволяют обновлять сопоставление при блокировке этого конкретного ключа (или ведра), что подразумевает, что предоставленная функция * не должна * пытаться обновить другое сопоставление во время оценки (или попытайтесь приобрести любой другой замок). Таким образом, * правильно используется *, 'ConcurrentHashMap' никогда не вызовет тупик, но возможность тупика при некорректном использовании не означает, что' ConcurrentHashMap' не является потокобезопасным ... – Holger

ответ

5

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

Это не обязательно означает, что любая такая архитектура сама по себе уязвима для мертвых замков.

Пример: типичная ситуация с мертвой блокировкой, когда нить А имеет замок L1 и ждет блокировки L2; тогда как нить B содержит L2 и нуждается в L1. Если у вас есть только один объект, тогда этот сценарий один .. это не может случиться.

Другими словами: вы не используете класс X, он будет предотвратить тупиков. Это невозможно. Если вообще, вы можете использовать класс X, потому что он предлагает вам функциональность, которая позволяет вам создать «гарантированный-без блокировки» дизайн!

4

Тупик может произойти только тогда, когда являются двумя разными замками, то есть когда вы держите замок и ожидаете освобождения другого замка. (Однако есть больше условий для тупиков).

Как ConcurrentHashMap пытается избегать замков, где это возможно, вы не в состоянии получить блокировку с операциями только на карте, что карта может ждать. Следовательно, операции только на карте не вызывают взаимоблокировок.


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

Вы также можете посмотреть на Wikipedia article.

+0

Хороший ответ тоже; и на самом деле не так сильно отличается от моего. Давайте чтим это. – GhostCat

Смежные вопросы