Я перечитываю Java Concurrency На практике, и я не уверен, что полностью понимаю главу о неизменности и безопасной публикации.
Что говорит книга:
Неизменяемые объекты могут безопасно использоваться любым потоком без дополнительных синхронизации, даже если синхронизация не используется для публикации их.
Я не понимаю, почему кто-нибудь (заинтересованный в правильном написании своего кода) публикует некоторые ссылки ненадежно?
Если объект неизменен и он опубликован небезопасно, я понимаю, что любой другой поток, получающий ссылку на объект, будет видеть его правильное состояние из-за гарантий, предлагаемых надлежащей неизменностью (с полями final
и т.д.),
Но если публикация небезопасна, другой поток может по-прежнему видеть null
или предыдущую ссылку после публикации вместо ссылки на неизменяемый объект, который мне кажется чем-то, что никто не хочет.
И если безопасная публикация используется, чтобы убедиться, что новая ссылка видна всеми потоками, тогда даже если объект просто эффективно неизменен (нет полей final
, но нет способа отключить их), тогда все безопасно еще раз. Как говорится в книге:
Безопасно опубликованные эффективно неизменяемые объекты могут безопасно использоваться любой поток без дополнительной синхронизации.
Итак, почему неизменность (против эффективной неизменности) так важна? В каком случае можно было бы искать небезопасную публикацию?