2013-08-25 3 views
0

Все еще явная блокировка требует от ConcurrentHashMap ввода и получения операций?Явная блокировка на Concurrent hashmap

С уважением,

Chinnu

+4

Still например при условии? –

+5

В общем случае явная блокировка не требуется. Это смысл использования коллекций Concurrent *. – dnault

ответ

1

ConcurrentHashMap является поточно-альтернатива обычной HashMap - так явная блокировка не требуется. Этот метод использует все структуры данных из параллельной коллекции.

+0

, то почему concurrentHashmap имеет метод putIfAbsent. Это действительно confusing.if я делаю некоторую сумму Bigdecimal в пределах карты .do i reaaly требует некоторого потокобезопасного здесь? – user2684215

+0

Я не уверен, что у меня есть ваш вопрос. Если у вас есть общие данные, и у вас есть несколько потоков, которые имеют доступ к этим данным, может возникнуть взаимоблокировка, поэтому вам нужна какая-то безопасность потоков. –

+0

. В соответствии с вашим ответом вы сказали, что не требуют явной блокировки. Когда требуется метод putIFAbsent и когда использовать это? – user2684215

0

ConcurrentHashMap является потокобезопасным и не требует явной блокировки. Все операции над ним являются потокобезопасными, но операции поиска (get) не используют блокировку и могут перекрываться с операциями обновления (put и remove) и таким образом отражать результаты последних завершенных операций обновления. Более того, для любой операции обновления полная ConcurrentHashMap никогда не блокируется, а блокировка происходит на уровне ведра (сегмента).

Метод putIfAbsent просто ставит отображение ключ-значение, если карта еще не содержит указанный ключ, который эквивалентен:

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

спасибо, предположим, что у меня есть один метод, основанный на некоторых условиях, он будет запрашивать базу данных и помещать этот результат в map object.so для каждого значения запроса в объекте карты в конечном итоге будет chnage.It означает, что один поток будет чередовать этот объект карты, а другой поток попытается для получения значений с одной и той же карты. Этот объект карты не определяется на уровне класса, он определен на уровне метода. В этом случае, если я использую метод putIFABsent, вы получите правильные значения для первого потока? кроме того, какую-нибудь дополнительную выгоду я получу? – user2684215

+0

Не могли бы вы уточнить свой вопрос? Может включать ваш фрагмент кода в самом вопросе. –

+0

how putIfAbsent метод работает с несколькими потоками?. One thread update map и другой поток читают одну и ту же карту. В обоих случаях данные разные. В то время как обновления второго потока видят первый поток, то это условие гонки. Так как putIfabsent разрешает эту проблему. – user2684215

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