2013-09-05 2 views
0

У меня есть запрос относительно ConcurrentHashMap.Запрос относительно ConcurrentHashMap в Java

ConcurrentHashMap - это карта для одновременного доступа. ConcurrentHashMap реализует ConcurrentMap, который распространяется Map.

a) ConcurrentHashMap реализует методы, определенные в ConcurrentMap (например, putifAbsen t и т. Д.), Которые являются атомарными.

b) Но как насчет методов в интерфейсе карты, который ConcurrentMap расширяет? Как они теперь атомарны? Были ли они переопределен ConcurrentHashMap

Если у меня есть ссылка типа ConcurrentHashMap и вызова метода из Map интерфейса (например путы) или любого другого метод, это метод атомного метода?

+0

Что вы видите, глядя на код? Это похоже на копию или повторную реализацию? –

ответ

1

Map - это просто интерфейс. Поэтому ConcurrentHashMap имеет атомную реализацию этих методов.

putIfAbsent метод является удобным способом в параллельной среде для выполнения атомной if not contains then put, что вы не можете сделать из интерфейса Map, даже если на самом деле Map типа ConcurrentHashMap.

1

ConcurrentHashMap не распространяется на HashMap. Они оба являются реализациями hash table, но ConcurrentHashMap имеет очень разные внутренности для HashMap, чтобы обеспечить параллелизм.

Если вы предоставляете ConcurrentHashMap методу, который принимает карту, то это будет работать, и вы получите ожидаемое поведение, которое вы ожидаете. Карта - это просто интерфейс, который описывает набор методов, ConcurrentHashMap реализует этот интерфейс с одновременным поведением.

Существует различие между «параллельным» и «атомарным». Параллельно означает, что одновременно могут выполняться несколько операций, и Карта (или любая структура данных, о которой мы говорим) ВСЕГДА БУДЕТ В ДЕЙСТВИТЕЛЬНОМ СОСТОЯНИИ. Это означает, что у вас может быть несколько потоков, вызывающих put(), get(), remove() и т. Д. На этой карте, и никогда не будет никаких ошибок (если вы попробуете это с помощью обычного HashMap, вы получите ошибки, поскольку это не предназначенный для обработки параллелизма).

Атомный означает, что действие, выполняющее несколько шагов, похоже, делает один шаг к другим потокам - так же хорошо, как они знают, что оно полностью закончено или еще не началось. Для ConcurrentHashMap одним из таких примеров является putIfAbsent(). Из javadoc,

Если указанный ключ еще не связан со значением, сопоставьте его с заданным значением. Это эквивалентно:

if (!map.containsKey(key)) { 
    return map.put(key, value); 
else 
    return map.get(key); 

за исключением того, что действие выполняется атомарно.

Если вы попробовали вышеуказанный код с ConcurrentHashMap, вы не получили бы никаких ошибок (поскольку это Concurrent), но есть хорошие изменения, которые другие потоки будут чередовать с основным потоком, и ваша запись будет перезаписана или удален. ConcurrentMap указывает атомный метод putIfAbsent(), чтобы гарантировать, что реализации могут выполнять эти шаги атомарно, без помех от других потоков.

0

Реализация этих методов, таких как put() и remove(), получает блокировку на конечном объекте Sync, одновременный поиск всегда дает самые последние данные на карте.

В случае putAll() или clear(), который работает на всей карте, одновременное чтение может отражать вставку и удаление только некоторых записей.

Ниже две ссылки помогут вам понять: http://javarevisited.blogspot.in/2013/02/concurrenthashmap-in-java-example-tutorial-working.html

http://www.javamex.com/tutorials/synchronization_concurrency_8_hashmap2.shtml

+0

Это полностью зависит от реализации. То, что вы говорите, верно для HashMap (хотя видимость в памяти - это наименьшая из ваших проблем, вы получите ошибки), но не для ConcurrentHashMap, где все изменения видны для других потоков немедленно. –

+0

@TomMcIntyre: Может быть, я не ясен, но из документально ясно сказано, что статут «putAll и четкие параллельные поисковые запросы могут отражать вставку или удаление только некоторых записей». http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html. Будет здорово, если вы поможете мне понять немного дальше. –

+0

Мой комментарий был направлен больше на ваш первый абзац. Если поток возвращает из вызова put() в ConcurrentHashMap, все остальные потоки смогут увидеть результат этой операции, дальнейшая синхронизация не требуется. –

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