2011-12-22 4 views

ответ

0

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

С другой стороны, Hashtable синхронизирован и должен быть потокобезопасным.

+0

Он задал вопрос о взаимоблокировках, а не о безопасности нитей. – Tudor

+0

Есть более эффективные альтернативы доисторическому 'Hashtable' – adarshr

+0

Yep, например, ConcurrentHashMap. –

1

Заблокирован, когда 2 актера запираются и ждут ресурсов друг друга.

Конечно, при использовании HashMap может произойти взаимоблокировка. Но тупик сделан вашим кодом, который использует HashMap.

Проверьте свой код, я прошу ответа в нем.

2

Сам hashmap не блокирует. Тем не менее, любой правильный код, который читает и изменяет одну и ту же карту из нескольких потоков, должен будет использовать блокировки. Как только блокировка входит в изображение, существует вероятность блокировок.

Не зная больше о том, сколько замков существует и как они используются, невозможно точно сказать, возможен ли взаимоблокировка.

4

Тупики срабатывают только в том случае, если вы используете несколько замков и не блокируете/не разблокируете их в правильном порядке. Если вы только защищаете свой HashMap одним (правильно используемым) замком (или вообще нет), то взаимоблокировки не могут возникнуть.

Обратите внимание, что стандарт HashMap не защищен каким-либо образом, поэтому только ваш код блокировки (который вы не отправили) может вызвать тупик.

-1

Вы действительно имеете в виду тупик или, может быть, бесконечный цикл? При использовании несинхронизированного HashMap в среде с mutithreaded несколько модификаций могут создавать структуру структуры хэш-структуры с внутренней структурой. Используйте Collections.synchronizedMap(), чтобы этого избежать.

-1

HashMap не является потокобезопасным. Чтобы сделать HashMap потокобезопасным, используйте метод Collections.synchronizedMap().

HashMap<K, V> map = Collections.synchronizedMap(new HashMap<K, V>()); 
1

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

java.util.concurrent.ConcurrentHashMap является потокобезопасным и обеспечивает хорошую производительность. Однако для многопоточности существует много общего.

+0

Мое правило большого пальца, если вы используете: 'ConcurrentMap', как и обычная' Map' (т. Е. Только put/get/remove), должно быть что-то не так. – bestsss

1

Заблокировать невозможно, используя незарегистрированный HashMap. Класс HashMap не блокирует, поэтому нет возможности для взаимоблокировки.

Однако, если вы использовали Collections.synchronizedMap(...) для обертывания HashMap, и вы использовали его в сочетании с другой блокировкой, вы могли бы получить тупик ... если разные потоки приобрели блокировки объектов в другом порядке.

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

1

Я видел, что HashMap переходит в бесконечные циклы, когда он одновременно изменяется. Это не связано с тупиком (или livelock), но оно вызвано перемещением поврежденной структуры данных.

Это особенно происходит, когда ковш преобразуется в TreeNode, поскольку код, который пересекает деревья, не защищает себя от неработающих ссылок.

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

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