Java Concurrent Коллекции и видимость
Я немного не уверен, что ожидать от Concurrent Collections (например, ConcurrentMap) в отношении видимости данных в коллекции.
A: Thread1 помещает сложный объект, а Thread2 получает его. Все ли атрибуты будут видны в теме 2?
B: Thread1 помещает сложный объект, а затем изменяет некоторые атрибуты. Тогда Thread2 получит его, все ли изменения будут видны в Thread2?
Я предполагаю, что B ложно, и если так, я должен синхронизировать каждый доступ к сложному объекту?
2 ответа
A: Если объект является неизменным или если объект является изменяемым, но все свойства установлены до того, как объект будет добавлен в коллекцию, тогда да, все они будут видны. B: Если механизмы синхронизации отсутствуют, это не гарантируется, это зависит от того, когда поток 2 обращается к объекту.
Если вам нужно гарантированное поведение такого рода (т. Е. Поток чтения, который будет гарантированно видеть все изменения, внесенные потоком-мутатором в транзакционной манере), я предлагаю вам установить механизм семафоринга. Более того, было бы проще, если бы вы использовали неизменяемые объекты.
Нажатие на одновременную коллекцию определяется как ее публикация. См. " Свойства согласованности памяти" в описании пакета.
Это означает, что если вы просто измените сохраненный объект, вы не получите автоматически произойдет, прежде чем отношения. Вам нужно будет сделать эти изменения синхронизированными / изменчивыми или использовать сам параллельный примитив.