延迟初始化(lazy initialization),也就是在真正被使用的时候才开始初始化的技巧。
不论是静态还是实例,都可以进行延迟初始化。
其本质是初始化开销和访问开销之间的权衡。
毕竟是一种优化技巧,使用不当会起反效果。
尤其是在多线程场景中这种反效果会尤为明显,因为我们要对这个进行延迟初始化的field进行同步。

先一步步开始,如果初始化开销不值一提,我们只需要保证其不可变即可:

private final FieldType field1 = computeFieldValue();

如果还有的商量,初始化开销可能让人在意,下面是最简单的的方式,直接在访问方法声明里加了synchoronized修饰,这种方式将访问开销最大化了:

private FieldType field2;

synchronized FieldType getField2() {
if (field2 == null)
field2 = computeFieldValue();
return field2;
} private static FieldType computeFieldValue() {
return new FieldType();
}

如果要改为静态的也不过是加上static修饰,但对于静态初始化,我们可以使用class holder方式:

private static class FieldHolder {
static final FieldType field = computeFieldValue();
} static FieldType getField3() {
return FieldHolder.field;
} private static FieldType computeFieldValue() {
return new FieldType();
}

这种方式感觉不错,我们没有进行额外的同步处理,只有在访问getField3的时候FieldHolder才会被初始化。
所以这种情况属于没有增加访问开销也保证了延迟特性。

这次试试优化一下实例field的访问开销,最经典的就是double-check了,这个东西经常出现在笔试题中:

private volatile FieldType field4;

FieldType getField4() {
FieldType result = field4;
if (result == null) {
synchronized (this) {
result = field4;
if (result == null)
field4 = result = computeFieldValue();
}
}
return result;
}
private static FieldType computeFieldValue() {
return new FieldType();
}

代码中使用了result局部变量,这样做虽然不是必要的,但这样可以确保field已被初始化的情况下被读取一次,可以提高少许效率。

以上就是延迟初始化的一些常用方式。
延迟初始化看起来不错,但建议权衡访问和创建的开销,对于实例field使用double-check,对于静态field使用holder class,以在多线程访问时保证check-then-action的原子性。

Java - 延迟初始化的更多相关文章

  1. Effective Java 第三版——83. 明智谨慎地使用延迟初始化

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  2. JAVA 双重检查锁定和延迟初始化

    双重检查锁定的由来在Java程序中,有时需要推迟一些高开销的对象的初始化操作,并且只有在真正使用到这个对象的时候,才进行初始化,此时,就需要延迟初始化技术.延迟初始化的正确实现是需要一些技巧的,否则容 ...

  3. Java对象延迟初始化的实现

    一.什么是延迟初始化? 在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销. 延迟初始化实际上就是:当我们要进行一些高开销的对象初始化操作时,只有在使用这些对象时才进行初始 ...

  4. Effective Java 之-----关于延迟初始化

    1.大多数情况下,正常的初始化要优先于延迟初始化. private final FieldType field = computeFieldValue(); 2.如果利用延迟优化来破坏初始化的循环,就 ...

  5. 从学习“单例模式”学到的Java知识:双重检查锁和延迟初始化

    一切真是有缘,上午刚刚看完单例模式,还在为其中的代码块同步而兴奋,下午就遇见这篇文章:双重检查锁定与延迟初始化.我一看,文章开头语出惊人,说这是一种错误的优化,我说,难道上午学的东西下午就过时了吗?仔 ...

  6. 双重检查锁定与延迟初始化(转自infoq)

    很好的文章,转自http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization 在java程序中,有 ...

  7. volatile双重检查锁定与延迟初始化

    一.基本概念: 1.volatile是轻量级的synchronized,在多核处理器开发中保证了共享变量的“可见性”.可见性的意思是,当一个线程修改一个共享变量时,另一个线程能读到这个修改的值. 2. ...

  8. spring3: 延迟初始化Bean

    3.3.1  延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy- ...

  9. (转)Android高性能编程(2)--延迟初始化

    上一篇文章,讲到了很多Android应用开发中需要注意的性能和内存方面的技巧.这一篇文章就是从smali指令级来分析性能优化和内存优化的问题. 如何解决界面启动时间开销大的问题 我们在编写Androi ...

随机推荐

  1. Day 15 内置函数 , 匿名函数.

    1. 最大值 max,最小值# #最大值 ret = max(1,2,-3)print(ret)# 结果 2ret=max([1,2,3,4])print(ret)# 结果 4 2.sum 函数用法 ...

  2. Educational Codeforces Round 26 A B C题

    题目链接 A. Text Volume 题意:计算句子中,每个单词大写字母出现次数最多的那个的出现次数(混不混乱QAQ). 解题思路:注意getchar()就没啥了. #include<cstd ...

  3. Zookeeper之Curator(1)客户端基本的创建,删除,更新,查找操作api

    Curator Framework提供了简化使用zookeeper更高级的API接口.它包涵很多优秀的特性,主要包括以下三点: 自动连接管理:自动处理zookeeper的连接和重试存在一些潜在的问题: ...

  4. Storm Trident API

    在Storm Trident中有五种操作类型 Apply Locally:本地操作,所有操作应用在本地节点数据上,不会产生网络传输 Repartitioning:数据流重定向,单纯的改变数据流向,不会 ...

  5. Vue 项目优化,持续更新...

    一.减少打包的体积 通过vue-cli 初始化项目后,使用 npm run build 生成的JS文件往往会很大,加载时间过长导致页面长时间白屏,所以我们尽可能的使用一下方法来减少打包体积. 1.1 ...

  6. Python3模块: hashlib

    简介: 用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法. 在python3中已经废弃了md5和sha模块,简单说 ...

  7. 【GDKOI2016】 魔卡少女 线段树

    题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作 每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和. 数据范围:$n,m≤10^5$,$a_i ...

  8. WPF快速实现XML可视化编辑工具

    虽然最近业余时间主要都放在研究AngularJS上了,不过由于正好要帮朋友做一个生成XML的小工具,顺便又温顾了一下WPF.虽然这个时代相对于Web应用和移动App,Windows应用程序是越来越少了 ...

  9. Mac下使用zsh不执行/etc/profile文件

    Mac下使用了zsh会不执行/etc/profile文件,当然,如果用原始的是会执行. 转而执行的是这两个文件,每次登陆都会执行: ~/.zshrc与/etc/zshenv与/etc/zshrc 所以 ...

  10. 如何使用Android Studio提高App质量

    Android Studio作为现在谷歌主推的Android开发功能,除了提供了大量的功能帮助快速开发Android代码之外,在代码质量控制方面也提供了很多工具,这些工具都放在Analyze菜单下, ...