安全发布和不可变与有效不可变的优势
我正在重读Java并发实践,我不确定我是否完全理解了关于不可变性和安全发布的章节。
书中说的是:
任何线程都可以安全地使用不可变对象,而无需额外的同步,即使不使用同步来发布它们也是如此。
我不明白的是,为什么有人(有兴趣使他的代码正确)不安全地发布一些引用?
如果对象是不可变的,并且它以不安全的方式发布,我理解任何其他线程获取对该对象的引用都会看到其正确的状态,因为适当的不可变性(使用字段等)提供了保证。final
但是,如果发布不安全,另一个线程可能仍然可以看到发布后或以前的引用,而不是对不可变对象的引用,这在我看来是没有人想要的。null
如果使用安全发布来确保所有线程都能看到新引用,那么即使对象实际上是不可变的(没有字段,但没有办法将它们静音),那么一切都再次安全。正如书中所说:final
安全发布有效不可变对象可以由任何线程安全地使用,而无需额外的同步。
那么,为什么不可变性(与有效的不可变性)如此重要呢?在什么情况下会想要不安全的出版物?