Безопасен ли этот поток для обновления entry.value.field непосредственно в ConcurrentHashMap?

Иногда нам нужно обновить один field из entry.value. потокобезопасный способ сделать это - создать новый entry.value и использовать метод put для обновления. то есть мне нужно сделать глубокую копию исходного значения, хотя я просто делаю небольшую модификацию.

Могу ли я сделать это обновление, как

map[key].field = fieldValue;

person pythonee    schedule 02.05.2013    source источник
comment
На каком языке мы здесь?   -  person bmargulies    schedule 10.07.2013


Ответы (2)


Хэш-карта безопасно возвращает запись, но назначение поля выходит за рамки карты. Итак, вы должны сделать что-то здесь для безопасности потоков. Ваш код эквивалентен:

Entry entry = map[key];
entry.field = fieldValue;

Очевидно, что оператор присваивания полей ничего не знает о карте.

person kan    schedule 02.05.2013
comment
то есть мне нужно дополнительно synchronized или volatile, чтобы убедиться, что последнее обновленное значение может быть видно другому потоку? - person pythonee; 03.05.2013
comment
@pythonee Да, конечно. Но дело в том, что это совершенно не связано с параллельной хеш-картой. - person kan; 03.05.2013

Может замок на сам вход нужен. Если это просто присваивание, то volatile.

person performanceuser    schedule 10.07.2013