2016-04-03 4 views
1

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

Позволяет сказать

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

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

Тема 2: попытка записи/изменения в ней mp.put (1, «Hi»).

так Какое значение читает нить 1?

Редактировать: Я имел в виду ConcurrentHashMap.

+0

Здравствуйте, или Hi, в зависимости от порядка операций (при условии, что карта является ConcurrentHashMap, а не HashMap). –

+0

http://stackoverflow.com/questions/3222512/thread-safe-hash-map –

+1

Вы спрашиваете о 'java.util.HashMap', используемом одновременно, или о' java.util.concurrent.ConcurrentHashMap'? –

ответ

2

Какую ценность получает нить 1?

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

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

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

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

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 добавила значение. Примечание: это значение доступно только один раз.