2015-01-15 3 views
2

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

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

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

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

+0

Просьба привести конкретные примеры кода. –

+0

Где ваш код? –

+0

Необходимо синхронизировать получатели и сеттеры для членов вашего сложного объекта. –

ответ

2

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

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

3

Нажатие на параллельную коллекцию определяется как ее публикация. См. «Memory Consistency Properties» в описании пакета.

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