Исключительная блокировка ConcurrentHashMap

Я знаю, что невозможно заблокировать ConcurrentHashMap для монопольного доступа. Однако я не могу найти, почему.

Это потому, что «сегменты», составляющие CHM, не раскрываются API? Предположительно, если бы они были, клиентский код мог бы выполнять блокировку «вручную»?

Ваше здоровье


person CaptainHastings    schedule 25.02.2014    source источник
comment
Потому что они пошли на многое, чтобы сделать это одновременно? Вы всегда можете синхронизировать его, если вам нужно.   -  person user207421    schedule 25.02.2014
comment
@Jeffrey - Как можно добавить n, где n>1, элементов атомарно?   -  person CaptainHastings    schedule 25.02.2014
comment
@Jeffrey Я предполагаю, что putAll (у меня нет исходного кода) перебирает карту и вызывает putIfAbsent для каждого элемента? Если это так, то только отдельные путы являются атомарными, но не все путы вместе.   -  person CaptainHastings    schedule 25.02.2014
comment
@CaptainHastings А, вы в основном верно.   -  person Jeffrey    schedule 25.02.2014


Ответы (2)


Я знаю, что невозможно заблокировать ConcurrentHashMap для монопольного доступа. Однако я не могу найти, почему.

Просто - потому что это неправда. Как насчет одного экземпляра на поток? Как насчет синхронизированных методов или синхронизированных блоков? Как насчет логики доступа к семафору?

person Antoniossss    schedule 25.02.2014
comment
Согласен с тобой. Мы можем заблокировать одновременную карту от монопольного доступа, но это не обязательно. Вместо этого используйте параллельную версию API, например putIfAbsent() и т. д. - person Lyju I Edwinson; 25.02.2014
comment
Но на какой объект вы получите блокировку, используя синхронизированные методы и блоки? Из JCIP. Единственная функция, предлагаемая синхронизированными реализациями Map, но не ConcurrentHashMap, — это возможность заблокировать карту для монопольного доступа. При использовании Hashtable и synchronizedMap получение блокировки карты предотвращает доступ к ней любого другого потока. - person CaptainHastings; 25.02.2014
comment
На объекте карты или на любом другом объекте общей блокировки? Если мы говорим о способностях, то речь идет о реализации и о том, что находится под капотом - например. синхронизированные карты имеют синхронизированные методы доступа, поэтому они блокируются сами по себе из коробки, вам не нужно неявно определять синхронизированные методы или блоки самостоятельно. Я не знаю каких-либо недостатков для получения блокировки на любом объекте карты. - person Antoniossss; 25.02.2014
comment
Что касается этого, мне любопытно, и я прямо сейчас копаю некоторую информацию по этой теме. - person Antoniossss; 25.02.2014
comment
И я прав, вы можете заблокировать CHM, как и любой другой объект. Проверьте это stackoverflow.com/questions/21658335/. Просто это не имеет никакого смысла, поскольку CHM должен быть доступен одновременно. Тем не менее, вы можете синхронизироваться - но вы потеряете все преимущества CHM - вы также можете заменить его HashMap. - person Antoniossss; 25.02.2014
comment
Я думаю, что synchronized(map) { ... } означает, что карта заблокирована для эксклюзивного доступа. - person Alexey Malev; 03.04.2014

Эксклюзивная блокировка concurrenthashMap может быть получена с помощью синхронизатора в JAVA, такого как Synchronizationblock, API блокировки

person Harsh Maheswari    schedule 12.10.2016