0

У меня есть нить A сохранение структуры данных (добавление, удаление, изменение значений в ConcurrentHashMap).Имеет ли новый поток полную видимость всех предыдущих действий других потоков на общих объектах?

У меня есть нить B слушать на сокете, а иногда создавая поток C для обработки нового подключения клиента.

Все нити C s только когда-либо читать из ConcurrentHashMap поддерживается резьбой (не обновлять).

ли нить C гарантированно видеть все обновления, которые были выполнены с помощью резьбы , на ConcurrentHashMap до резьбы C была создана/начата нить B?

(ред последнее предложение сделать вопрос яснее:. Дело только об обновлениях ConcurrentHashMap)

+0

Да, при условии соблюдения положений модели памяти Java * (q.v.) *. В основном вам нужно убедиться, что каждый доступ «синхронизирован» или эквивалент «java.util.concurrent». – EJP

ответ

1

Является ли поток C гарантированным на просмотр всех обновлений, которые были выполнены нитью A до того, как поток C был создан/запущен потоком B?

В целом (например, с помощью обычного HashMap), №

Но (опять же в общем случае), если нить C была создана нить А, то ответ будет да.

(Существует происходит, прежде, чем отношения между одним потоком вызывающего start() на объект потока, и началом run() метода нового потока. Но вы ввели третью нить ... и не описал все, что даст вам происходит-до цепочка от А до В до С.)


Однако, вы говорите о ConcurrentHashMap здесь, и одновременно карты имеют врожденную консистенцию памяти:

«Память консистенцию эффекты: Как и в других параллельных коллекций, действия в потоке до размещения объект в ConcurrentMap в качестве ключа или значения - перед действиями после доступа или удаления этого объекта из ConcurrentMap в другом потоке ».

(Из ConcurrentMapjavadoc.)

Итак, для чего, где несколько потоков обмена с ConcurrentHashMap потоком только для чтения гарантирован увидеть обновление, сделанное другой ... по модулю документированного поведения итераторы.

+0

Спасибо за этот исчерпывающий ответ. Мой вопрос был плохо сформулирован, я должен был упомянуть поток C только для чтения из ConcurrentHashMap, а не спрашивать, были ли какие-либо обновления видны (подразумевая возможные обновления для неконкурентных объектов). – RonR

+0

Я уже предполагал, что это так. –

1

Да, как указано в docs:

извлечений отражают результаты самого последнего завершения обновления операции с их началом. (Более формально, операция обновления для данного ключа несет происходит, прежде чем связь с любыми (ненулевой) извлечениями для этого ключа отчетности обновленного значения.)

1

Да, если объект ConcurrentHashMap общих глобально или передано/передано в/с thread C.

1

Ваша фраза

выполнена резьба А до создания нити C/запускается нить B?

имеет не определенную концепцию, поскольку Java Memory Model не предоставляет никаких гарантий, основанных на временном заказе. Вы должны убедиться, что происходит до, заказывая либо по заказу программы, либо по заказу синхронизации, и вы, похоже, ничего не делаете.

Таким образом, ответ на ваш вопрос с «нет» был бы неправильным, потому что вопрос имеет ложное скрытое предположение.

1

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

Исправьте меня, если я ошибаюсь, изменчивые переменные всегда возвращают свое обновленное значение.

Смежные вопросы