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 之-----关于延迟初始化的更多相关文章
- Effective Java 第三版——83. 明智谨慎地使用延迟初始化
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- JAVA 双重检查锁定和延迟初始化
双重检查锁定的由来在Java程序中,有时需要推迟一些高开销的对象的初始化操作,并且只有在真正使用到这个对象的时候,才进行初始化,此时,就需要延迟初始化技术.延迟初始化的正确实现是需要一些技巧的,否则容 ...
- Java对象延迟初始化的实现
一.什么是延迟初始化? 在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销. 延迟初始化实际上就是:当我们要进行一些高开销的对象初始化操作时,只有在使用这些对象时才进行初始 ...
- Java - 延迟初始化
延迟初始化(lazy initialization),也就是在真正被使用的时候才开始初始化的技巧. 不论是静态还是实例,都可以进行延迟初始化. 其本质是初始化开销和访问开销之间的权衡. 毕竟是一种优化 ...
- 从学习“单例模式”学到的Java知识:双重检查锁和延迟初始化
一切真是有缘,上午刚刚看完单例模式,还在为其中的代码块同步而兴奋,下午就遇见这篇文章:双重检查锁定与延迟初始化.我一看,文章开头语出惊人,说这是一种错误的优化,我说,难道上午学的东西下午就过时了吗?仔 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- 双重检查锁定与延迟初始化(转自infoq)
很好的文章,转自http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization 在java程序中,有 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- Effective Java 第三版——6. 避免创建不必要的对象
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- asp.net权限认证篇外:4种认证类型比较
1.基本认证,这是以base64加密用户口令并通过http header传输的一种认证方式,但是很容易被破解,因为base64解密没有任何难度: 如果数据被截包,会直接泄露用户口令:所以一般情况下都不 ...
- nohup—后端守护进程
要将一个命令放到后台执行,我们一般使用nohup sh command & 为什么要nohup? 因为我用使用Scrt这种终端工具退出的时候会向我们在当前shell下启动的进程发生一个SIGH ...
- Java集合源码分析(三)Vevtor和Stack
前言 前面写了一篇关于的是LinkedList的除了它的数据结构稍微有一点复杂之外,其他的都很好理解的.这一篇讲的可能大家在开发中很少去用到.但是有的时候也可能是会用到的! 注意在学习这一篇之前,需要 ...
- UESTC1599-wtmsb-优先队列
wtmsb Time Limit: 1000/100MS (Java/Others) Memory Limit: 131072/131072KB (Java/Others) 这天,AutSky_Jad ...
- Win10下安装RabbitMQ以及基本知识学习
一.为什么选择RabbitMQ? 先说一下场景,这是我们公司遇到,当然我这里不做业务评价哈?虽然我知道他很不合理,但是我是无能为力的.APP端部分注册是Java开发的系统,然后业务端是C#开 ...
- 三分钟使用webpack-dev-sever搭建一个服务器
webpack-dev-server是一个小型的Node.js Express服务器,我们可以通过它搭建一个本地服务器,并且实现文件热更新; 1.切换到你的目录下对项目进行初始化 npm init 一 ...
- HDU 5122 K.Bro Sorting(模拟——思维题详解)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an A ...
- 【centos6.5 hadoop2.7 _64位一键安装脚本】有问题加我Q直接问
#!/bin/bash#@author:feiyuanxing [既然笨到家,就要努力到家]#@date:2017-01-05#@E-Mail:feiyuanxing@gmail.com#@TARGE ...
- reduceByKeyLocally
2017年3月15日, 星期三 reduceByKeyLocally--Transformation类算子 代码示例
- javaIO详解、包含文件以及流操作
1.File 文件操作 java.io.File用来表示文件或者目录.只能用来表示文件或者目录的大小名称等信息,而无法完成对文件内容的CRUD. 1.1构造方法 有四种,当然基本都是根据文件的路径或者 ...