Java Concurrent Коллекции и видимость

Я немного не уверен, что ожидать от Concurrent Collections (например, ConcurrentMap) в отношении видимости данных в коллекции.

A: Thread1 помещает сложный объект, а Thread2 получает его. Все ли атрибуты будут видны в теме 2?

B: Thread1 помещает сложный объект, а затем изменяет некоторые атрибуты. Тогда Thread2 получит его, все ли изменения будут видны в Thread2?

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

2 ответа

Решение

A: Если объект является неизменным или если объект является изменяемым, но все свойства установлены до того, как объект будет добавлен в коллекцию, тогда да, все они будут видны. B: Если механизмы синхронизации отсутствуют, это не гарантируется, это зависит от того, когда поток 2 обращается к объекту.

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

Нажатие на одновременную коллекцию определяется как ее публикация. См. " Свойства согласованности памяти" в описании пакета.

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

Другие вопросы по тегам