Что происходит, когда два потока пытаются изменить/получить доступ к одному и тому же ключу в Concurrent HashMap?

Я читал о hashMap и о том, чем он отличается от hashtable. Как и в хеш-таблице, блокируется весь объект, в то время как в случае параллельной хэш-карты блокируется только его часть. Мой вопрос заключается в том, что происходит, когда два потока одновременно пытаются получить доступ к одному и тому же значению, соответствующему ключу.

Скажем

 Map mp = new ConcurrentHashMap(); 
 mp.put(1, "Hello");

Тема 1: пытаюсь прочитать mp.get(1).

Тема 2: пытаюсь записать/изменить в нее mp.put(1, "Привет").

Итак, какое значение получает поток 1?

Изменить: я имел в виду ConcurrentHashMap.


person JavaQuest    schedule 03.04.2016    source источник
comment
Hello или Hi, в зависимости от порядка операций (при условии, что карта представляет собой ConcurrentHashMap, а не HashMap).   -  person JB Nizet    schedule 04.04.2016
comment
stackoverflow.com/questions/3222512/thread-safe-hash-map   -  person Darshan Mehta    schedule 04.04.2016
comment
Вы спрашиваете об одновременном использовании java.util.HashMap или о java.util.concurrent.ConcurrentHashMap?   -  person Daniel Pryden    schedule 04.04.2016
comment
Извините, я имел в виду concurrentHashMap   -  person JavaQuest    schedule 04.04.2016


Ответы (1)


Какое значение получает поток 1 для чтения?

Он будет читать два возможных значения, либо

  • он получает null, так как значение еще не установлено.
  • он получает значение Thread 2 set.

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

Где ConcurrentHashMap действительно полезен, так это в таких операциях, как putIfAbsent. Для передачи работы между потоками лучше выбрать Queue.

ConcurrentMap<Integer, BlockingQueue<String>> map = ...

Тема 1

String value = map.putIfAbsent(1, k -> new BlockingQueue<>()).take();

Тема 2

map.putIfAbsent(1, k -> new BlockingQueue<>()).offer("Hi");

В этом случае поток 1 будет блокироваться до тех пор, пока поток 2 не добавит значение. Примечание: это значение доступно только один раз.

person Peter Lawrey    schedule 04.04.2016