Как влияет производительность на разделение объектов между потоками? - PullRequest
5 голосов
/ 01 июля 2011

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

Должны ли потоки ждать, пока другие закончат читать память? Или данные неявно копируются (причина существования volatile)? Но что это будет делать для использования памяти всей JVM? И чем все это отличается, когда читаемый объект старше потоков, которые его читают, а не создан при их жизни?

Ответы [ 3 ]

3 голосов
/ 08 июля 2011

Если вы знаете , что объект не изменится (например, неизменяемые объекты, такие как String или Integer) и, следовательно, избежали использования любой из конструкций синхронизации (synchronized, volatile),чтение этого объекта из нескольких потоков не влияет на производительность.Все потоки получат доступ к памяти, в которой объект хранится параллельно.

Однако JVM может выбрать локальное кэширование некоторых значений в каждом потоке по соображениям производительности.Использование volatile запрещает только такое поведение - JVM будет вынужден явно и атомарно обращаться к полю volatile каждый раз.

1 голос
/ 01 июля 2011

Чтобы иметь общее состояние между несколькими потоками - вам необходимо согласовать доступ к нему, используя некоторый механизм синхронизации - volatile, synchronization, cas.Я не уверен, что вы ожидаете услышать о «влиянии на производительность» - это будет зависеть от конкретного сценария и контекста.Как правило, вам придется заплатить определенную цену за координацию доступа к общему объекту несколькими потоками.

1 голос
/ 01 июля 2011

Если данные читаются, это не имеет значения, поскольку несколько потоков могут одновременно обращаться к одной и той же памяти. Только когда запись происходит из-за механизмов блокировки, вы получите снижение производительности. Обратите внимание на volatile (не могу вспомнить, совпадает ли оно в Java с C), но оно используется для данных, которые могут измениться из-под программы (например, прямой адресации данных в c) или если вы хотите атомарность для ваших данных. Копирование данных не повлияет на производительность, но потребует больше памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...