我正在重新阅读《Java并发编程实战》,但我不确定自己是否完全理解了与不可变性和安全发布相关的章节。
书中所说的是:
不可变对象可以在没有额外同步的情况下被任何线程安全地使用,即使在发布时没有使用同步。
我不明白的是,为什么会有人(希望让自己的代码正确无误)会不安全地发布某个引用?
如果该对象是不可变的,并且它被不安全地发布了,那么我理解任何其他获得该对象引用的线程都会看到其正确的状态,因为通过适当的不可变性(使用final
字段等)提供了保证。
但是,如果发布是不安全的,那么另一个线程可能仍然会在发布后看到null
或以前的引用,而不是对不可变对象的引用,这似乎是没有人希望看到的。
如果使用安全发布确保所有线程都能看到新引用,那么即使对象只是有效不可变(没有final
字段,但没有方法可以修改它们),一切也将再次变得安全。 正如书中所说:
安全地发布有效不可变对象可以在没有额外同步的情况下被任何线程安全地使用。
那么,为什么不可变性(与有效不可变性相比)非常重要? 在什么情况下会希望进行不安全发布?