Почему ConcurrentHashMap нельзя заблокировать для монопольного доступа?

Цитата из #JCIP:

«Поскольку ConcurrentHashMap не может быть заблокирован для монопольного доступа, мы не можем использовать блокировку на стороне клиента для создания новых атомарных операций, таких как «положить, если отсутствует», как мы сделали для Vector».

Почему мы не можем просто получить блокировку, чтобы реализовать дополнительные атомарные методы и сохранить коллекцию поточно-ориентированной (например, синхронизированные коллекции, возвращаемые Collections.synchronizedxxx factory):


person Salah Eddine Taouririt    schedule 27.07.2013    source источник
comment
Потому что это должно быть одновременно.   -  person user207421    schedule 27.07.2013


Ответы (3)


Почему? Потому что реализация его не поддерживает. Прямо из ConcurrentHashMap JavaDocs:

нет поддержки блокировки всей таблицы таким образом, чтобы предотвратить любой доступ

...что по определению является "эксклюзивным доступом".

person Matt Ball    schedule 27.07.2013

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

Почему мы не можем просто получить замок:

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

person Thilo    schedule 27.07.2013

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

Но главное здесь в том, что java не предоставил ConcurrentHashMap для этой цели, его цель - позволить нескольким потокам работать одновременно.

Для вашего требования перейдите на HashTable.

person Lokesh    schedule 27.07.2013