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