即使不诉诸安全出版惯用语,也可以发布不可变对象是什么意思?
我已阅读实践中的Java并发(第3章,共享对象),但仍无法理解该声明:
可以通过任何机制发布不可变对象。
V/S
应该安全地发布有效的不可变对象。
编辑:我已经通过similar question on SO和答案,但仍然无法理解如何安全地发布不可变对象,因为引用不可变对象的字段有可能被视为null或某些陈旧外部线程从earler调用中获取的值。
答案 0 :(得分:2)
并非每个用例都需要在任何精确的时刻看到新的实例。考虑教科书示例:懒惰初始化的单例,在每个线程中重新初始化比安全共享更便宜。在这种情况下,您可能会不安全地共享不可变实例,并且每个无法接收已存在副本的线程将只创建自己的副本。
至于术语:不安全的发布意味着它发生在数据争用之下。 安全发布是相反的情况。
BTW java.lang.String
是一个有效不可变对象的示例,但仍可以不安全地共享。