мой код потокобезопасен?как добиться безопасности потока в этом случае нет? - PullRequest
1 голос
/ 25 апреля 2019

Мне задали вопрос в интервью. Что делать Если я хочу сохранить значения на карте следующим образом:

key_1 --> value 1
key_2 --> value 2
key_1 --> value 3

Здесь, если мы предположим, что и ключ, и значение в строке, то мы должнывозьмите карту вот так ..

Map<String,List<String>> m1 = new HashMap();

Тогда меня спросили, что если вы хотите добиться безопасности потока?Тогда я сказал, что мы можем взять ConcurrentHashMap для этой цели .. они сказали, что все в порядке ..

Тогда они спросили, является ли значение, которое я имею в виду, Список является потокобезопасным?Ex.

t1.get("key_1").put("value_4");    
t2.get("key_1").put("value_5");

Здесь предположим, что оба потока t1 и t2 работают параллельно.Так что, если это List<String> я имею в виду значение внутри ConcurrentHashMap является потокобезопасным?Если да, то как?а если нет то как этого добиться ??

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

ConcurrentHashMap - многопоточная структура данных. Если вы используете List<String> (который не является потокобезопасным) в значении ConcurrentHashMap, то List не является потокобезопасным, поскольку два потока могут сохранить ссылку на список и позже изменить его параллельно.

ConcurrentHashMap - это потокобезопасное средство. Его операции, такие как put и putAll e.t.c, являются потокобезопасными. Это не означает, что структура данных, которую вы используете в качестве значения, также становится поточно-безопасной.

Как этого добиться?

  • Используйте Thread Safe List<String> как CopyOnWriteArrayList в качестве значения в ConcurrentHashMap.
  • Сделайте настройку List и сделайте все методы Synchronized.
  • Преобразовать не-потокобезопасный List в потокобезопасный List, передав Collections.synchronizedList(non-Thread safelist).
0 голосов
/ 25 апреля 2019

Я сказал, что мы можем взять ConcurrentHashMap для этой цели ... они сказали, что все в порядке ..

Может быть, все в порядке, а может и нет.Это зависит от того, существуют ли какие-либо особые отношения между key_1 и key_2.

Предположим, что один поток сохраняет новое значение для key_1, а затем непосредственно перед тем, как он может сохранить связанное значение для key_2, его временной интервал заканчивается.Затем другой поток проверяет значения key_1 и key_2, пока первый поток приостановлен.Он видит новое значение для key_1, но видит old значение для key_2.

Имеет ли значение в тот момент, что первый поток завершил только половину обновления двух ключей?

Подключение ConcurrentHashMap гарантирует, что структура данных карты сама по себе не сделает ничего смешного или неправильного в многопоточном приложении, но если приложение зависит от этих двух ключей, которые всегда обновляются вместе, то выпо-прежнему потребуется какая-то явная блокировка, чтобы они всегда обновлялись вместе.

...