一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
前面我们说过Lazy注解,说了当我们的项目启动特别慢的时候,可以使用延迟加载对某些不是需要立即初始化的对象添加该注解,这里我们又要说下对于延迟初始化这件事,我们又是需要慎用的;
首先延迟初始化是延迟到需要域的值时才将它初始化,如果项目整个生命周期都没用到,那么永远也不会初始化,对于延迟加载,effective java指明非必要不建议使用,书上给出的具体原因是它虽然降低了初始化类和实例的创建开销,但是在我们需要该域的时候延迟初始化该域的开销却是变大的(主要是访问实例的判断),对于大访问量来说,延迟加载毫无疑问是降低了性能;
实例域
在正常初始化的时候我们可以直接创建对象或者get对于的实例,而对于延迟初始化,我想我们大家都是知道的,得加锁,就像单例模式那样得加双重检查的锁,得加volatile关键字,代码格式大家可以参考单例模式创建的代码来配合看以上是实例域的。
静态域
对于使用static表示的变量比如
public static class Mytest{
static final Aclass ac = getAnnoCla();
static Aclass getAnno(){
retuen Mytest.ac;}
}
getAnno()第一次调用初始化Mytest类,getAnno()也只会执行一次初始化,并不会增加任何访问的成本,所以静态域使用该方法最好,
总结:对于实例域使用使用双重校验锁+volatile,对于静态域则使用lazy init,当然了,如果你的初始化不介意多初始几次,那也没必要使用双重锁,写完@lazy注解,偶然在家翻书看到这个注意项,还是挺有道理的,下一讲再说说静态域里的变量和关键字