前言
本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见100个问题搞定Java虚拟机
正文
final实例字段涉及新建对象的发布问题。
当一个对象包含 final实例字段时,我们希望其他线程只能看到已初始化的final实例字段。
因此,即时编译器会在final字段的写操作后插入一个写写屏障,以防某些优化将新建对象的发布(即将实例对象写入一个共享引用中)重排序至final字段的写操作之前。
实例字段的可见性
新建对象的安全发布(safe publication)问题不仅仅包括 final 实例字段的可见性,还包括其他实例字段的可见性。
当发布一个已初始化的对象时,我们希望所有已初始化的实例字段对其他线程可见。
否则,其他线程可能见到一个仅部分初始化的新建对象,从而造成程序错误。
final字段的可见性
final关键字的可见性是指:被final修饰的字段在构造器中一旦初始化完成,并且构造器没有把“this”的引用传递出去
(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),
那在其他线程中就能看见final字段的值。
版权归原作者 Shockang 所有, 如有侵权,请联系我们删除。