Я столкнулся с этой строкой, которая гласит: «Однако, несмотря на то, что все операции являются потокобезопасными, операции поиска не влекут за собой блокировку, и нет никакой поддержки для блокировки всей таблицы таким образом, чтобы предотвратить весь доступ» в общее описание класса Java [ConcurrentHashMap] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html). Мой вопрос: означает ли это, что ConcurrentHasMap не предотвращает мертвую блокировку? Кроме того, я думал, что с точки зрения потолка подразумевается, что мертвый замок не будет иметь места?Нить безопасна, но не предотвращает тупик?
ответ
Вы получаете вещи не по пути: всякий раз, когда вы создаете конструкцию, требующую блокировки, вы открываете возможность для мертвых замков.
Это не обязательно означает, что любая такая архитектура сама по себе уязвима для мертвых замков.
Пример: типичная ситуация с мертвой блокировкой, когда нить А имеет замок L1 и ждет блокировки L2; тогда как нить B содержит L2 и нуждается в L1. Если у вас есть только один объект, тогда этот сценарий один .. это не может случиться.
Другими словами: вы не используете класс X, он будет предотвратить тупиков. Это невозможно. Если вообще, вы можете использовать класс X, потому что он предлагает вам функциональность, которая позволяет вам создать «гарантированный-без блокировки» дизайн!
Тупик может произойти только тогда, когда являются двумя разными замками, то есть когда вы держите замок и ожидаете освобождения другого замка. (Однако есть больше условий для тупиков).
Как ConcurrentHashMap пытается избегать замков, где это возможно, вы не в состоянии получить блокировку с операциями только на карте, что карта может ждать. Следовательно, операции только на карте не вызывают взаимоблокировок.
Однако потокобезопасность не означает тупиковый бесплатно. Это только гарантирует, что код будет работать в соответствии с его интерфейсом, даже при вызове из нескольких потоков. Создание класса потокобезопасное обычно включает в себя , добавив замки, чтобы гарантировать безопасное выполнение.
Вы также можете посмотреть на Wikipedia article.
Хороший ответ тоже; и на самом деле не так сильно отличается от моего. Давайте чтим это. – GhostCat
- 1. Тупик предотвращает
- 2. JTextArea нить безопасна?
- 3. Безопасна ли нить NHunspell?
- 4. Почему эта нить безопасна?
- 5. Is KafkaTemplate нить безопасна
- 6. NSKeyedArchiver нить безопасна?
- 7. SPSC нить безопасна с забором
- 8. Безопасна ли ORM нить django?
- 9. Безопасна ли эта кеширующая нить?
- 10. Безопасна ли сжатая матричная нить?
- 11. Тупик в Продюссе - потребительская нить
- 12. @ Синглтон в кинжале 2 нить безопасна?
- 13. Насколько безопасна нить локальная в Rails?
- 14. Когда тупик не тупик?
- 15. Почему ConfigureAwait (false) предотвращает тупик, если он находится внутри итерации?
- 16. java использовать нить, чтобы избежать GUI в тупик
- 17. Тупик при закрытии трубы, пока другая нить читает этот трубопровод?
- 18. нить выхода, но все еще удерживать мьютекс
- 19. Блокировка вызовов, но не блокирует нить
- 20. Scala Процесс завершается, но не очищает нить
- 21. Нить должна остановиться, но это не
- 22. нить достигает конца, но не удаляется
- 23. Безопасна ли GTK + 3?
- 24. Текущая нить предотвращает полное воспроизведение звука на iPhone
- 25. Нить безопасна или нет? Обновление не-потокобезопасной карты из параллельного потока
- 26. Не могу найти тупик
- 27. Заключительный тупик не возникает
- 28. ждут работы, но называя task.Result висит/тупик
- 29. Тупик при одновременном обновлении, но я не вижу параллелизма
- 30. C3P0 - ПОЛНЫЙ ТУПИК на MSSQL, но не PostgreSQL или MySQL
Операции над ConcurrentHashMap не вызывают взаимоблокировки - и, надеюсь, никто не будет маркировать кусок кода как потокобезопасный, если это может вызвать тупик. – nos
Спасибо для быстрой обратной связи и примите! – GhostCat
@nos: Это не так просто. В Java 8 «ConcurrentHashMap» предлагает методы «compute ...», которые позволяют обновлять сопоставление при блокировке этого конкретного ключа (или ведра), что подразумевает, что предоставленная функция * не должна * пытаться обновить другое сопоставление во время оценки (или попытайтесь приобрести любой другой замок). Таким образом, * правильно используется *, 'ConcurrentHashMap' никогда не вызовет тупик, но возможность тупика при некорректном использовании не означает, что' ConcurrentHashMap' не является потокобезопасным ... – Holger