Effective Java 之-----关于延迟初始化
Posted hunter_Cecil
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Java 之-----关于延迟初始化相关的知识,希望对你有一定的参考价值。
1、大多数情况下,正常的初始化要优先于延迟初始化。
private final FieldType field = computeFieldValue();
2、如果利用延迟优化来破坏初始化的循环,就要使用同步访问方法,因为它是最简单、最清楚的替代方法。
private FieldType field; synchronized FieldType getField(){ if(field == null){ field = computeFieldValue(); } return field; }
3、如果出于性能考虑需要对静态域使用延迟初始化,就使用lazy initialization holder class 模式,保证类要到被用到的时候才会被初始化。
private static class FieldHolder{ static final FieldType field = computeFieldValue(); } static FieldType getField(){ return FieldHolder.field; }
当getField被第一次调用时,第一次读取FieldHolder.field,导致FieldHolder得到初始化。
4、如果出于性能考虑需要对实例域使用延迟初始化,就使用双重检查模式(double check idiom),这种模式避免了在域被初始化之后访问这个域时的开销。
private volatile FieldType field; FieldType getField(){ FieldType result = field; if(result == null){ //First check(no locking) synchronized (this){ result = field; if(result == null){//second check(with locking) field = result = computeFieldValue(); } } } return result; }
两次检查域值,第一次检查时没有锁定,看这个域是否被初始化了;第二次检查时锁定,只有当第二次检查时表明这个域没有被初始化,才会调用computeFieldValue方法对这个域进行初始化。因为如果域已经被初始化就不会有锁定,域被声明为volatile很重要。
5、如果可以接收重复初始化,也可以考虑使用单重检查模式(single check idiom)
private volatile FieldType field; private FieldType getField(){ FieldType result = field; if(result == null){ field = result = computeFieldValue(); return result; }
以上是关于Effective Java 之-----关于延迟初始化的主要内容,如果未能解决你的问题,请参考以下文章
关于阅读java编程思想和effective java的一些看法
Java:Effective java学习笔记之 考虑实现Comparable 接口
Java:Effective java学习笔记之 始终要覆盖toString方法