2013-06-08 3 views
3

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

Я прочитал Java Параллелизм на практике (главе 3, Sharing объекты), но до сих пор не в состоянии понять утверждение:

Неизменные объекты могут быть опубликованы через любой механизм.

   V/S 

Эффективно неизменные объекты должны быть безопасно опубликованы.

Edit: Я был через similar question on SO и ответы, но все еще не в состоянии понять, как неизменное объекты могут быть опубликованы безопасно, потому что есть вероятность того, что поле ссылки на неизменный объект будет рассматриваться как нуль или некоторые устаревшие значения из укрытий от внешнего потока.

+1

Сам неизменяемый объект может быть опубликован безопасно, любое поле, относящееся к нему, не является частью неизменяемого объекта и поэтому не имеет одинаковых гарантий. – Trillian

+0

Они не могут измениться, поэтому вы можете думать о них как о «константах». Для любой константы вы ожидаете, что сможете публиковать без проблем параллелизма. – greedybuddha

+0

@Trillian Но на языке, таком как Java, что такое безопасно опубликованный объект, если ссылка на него по-прежнему устарела? Они должны быть в синхронизации, чтобы сказать, что объект был безопасно опубликован, не так ли? – Geek

ответ

2

Не каждый случай использования должен видеть новый экземпляр в любой момент. Рассмотрим пример учебника: лениво-инициализированные синглтоны, которые дешевле для повторной инициализации в каждом потоке, чем для безопасного обмена. В таком случае вы можете неимоверно делиться неизменным экземпляром, и каждый поток, который не сможет получить уже существующую копию, просто создаст свою собственную.

Что касается терминологии: Небезопасная публикация означает, что это происходит при гонке данных. Безопасное издание - это противоположный случай.

BTW java.lang.String является примером эффективно неизменяемого объекта, который, тем не менее, может быть разделен небезопасно.

+0

У меня есть два вопроса: 1) Почему вы говорите, что «лениво инициализированные синглеты дешевле переинициализировать в каждом потоке, чем безопасно делиться»? и 2) «* Небезопасная публикация означает, что это происходит по гонке данных *». Что такое раса данных в этом контексте? – Geek

+0

"* BTW java.lang.String - пример эффективно неизменяемого объекта, который, тем не менее, может быть разделен небезопасно. *" .. Не является ли String неотвратимым и неэффективным? – Geek

+1

Строка не является неизменной, потому что свойство 'hashCode' является изменяемым. Он является фактически неизменным, потому что его общедоступное поведение неизменно. –

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