Все еще явная блокировка требует от ConcurrentHashMap ввода и получения операций?Явная блокировка на Concurrent hashmap
С уважением,
Chinnu
Все еще явная блокировка требует от ConcurrentHashMap ввода и получения операций?Явная блокировка на Concurrent hashmap
С уважением,
Chinnu
ConcurrentHashMap является поточно-альтернатива обычной HashMap - так явная блокировка не требуется. Этот метод использует все структуры данных из параллельной коллекции.
, то почему concurrentHashmap имеет метод putIfAbsent. Это действительно confusing.if я делаю некоторую сумму Bigdecimal в пределах карты .do i reaaly требует некоторого потокобезопасного здесь? – user2684215
Я не уверен, что у меня есть ваш вопрос. Если у вас есть общие данные, и у вас есть несколько потоков, которые имеют доступ к этим данным, может возникнуть взаимоблокировка, поэтому вам нужна какая-то безопасность потоков. –
. В соответствии с вашим ответом вы сказали, что не требуют явной блокировки. Когда требуется метод putIFAbsent и когда использовать это? – user2684215
ConcurrentHashMap является потокобезопасным и не требует явной блокировки. Все операции над ним являются потокобезопасными, но операции поиска (get
) не используют блокировку и могут перекрываться с операциями обновления (put
и remove
) и таким образом отражать результаты последних завершенных операций обновления. Более того, для любой операции обновления полная ConcurrentHashMap никогда не блокируется, а блокировка происходит на уровне ведра (сегмента).
Метод putIfAbsent
просто ставит отображение ключ-значение, если карта еще не содержит указанный ключ, который эквивалентен:
if (!map.containsKey(key))
return map.put(key, value);
else
return map.get(key);
спасибо, предположим, что у меня есть один метод, основанный на некоторых условиях, он будет запрашивать базу данных и помещать этот результат в map object.so для каждого значения запроса в объекте карты в конечном итоге будет chnage.It означает, что один поток будет чередовать этот объект карты, а другой поток попытается для получения значений с одной и той же карты. Этот объект карты не определяется на уровне класса, он определен на уровне метода. В этом случае, если я использую метод putIFABsent, вы получите правильные значения для первого потока? кроме того, какую-нибудь дополнительную выгоду я получу? – user2684215
Не могли бы вы уточнить свой вопрос? Может включать ваш фрагмент кода в самом вопросе. –
how putIfAbsent метод работает с несколькими потоками?. One thread update map и другой поток читают одну и ту же карту. В обоих случаях данные разные. В то время как обновления второго потока видят первый поток, то это условие гонки. Так как putIfabsent разрешает эту проблему. – user2684215
Still например при условии? –
В общем случае явная блокировка не требуется. Это смысл использования коллекций Concurrent *. – dnault