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

延迟初始化(lazy initialization),也就是在真正被使用的时候才开始初始化的技巧. 不论是静态还是实例,都可以进行延迟初始化. 其本质是初始化开销和访问开销之间的权衡. 毕竟是一种优化技巧,使用不当会起反效果. 尤其是在多线程场景中这种反效果会尤为明显,因为我们要对这个进行延迟初始化的field进行同步. 先一步步开始,如果初始化开销不值一提,我们只需要保证其不可变即可: private final FieldType field1 = computeFieldValue();…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 83. 明智谨慎地使用延迟初始化 延迟初始化(Lazy initialization)是延迟属性初始化直到需要其值的行为. 如果不需要该值,则永远不会初始化该属性. 此技术适用于静态和实例属性. 虽然延迟初始化主要是一种优化,但它也可以用来打破类和实例初始…
双重检查锁定的由来在Java程序中,有时需要推迟一些高开销的对象的初始化操作,并且只有在真正使用到这个对象的时候,才进行初始化,此时,就需要延迟初始化技术.延迟初始化的正确实现是需要一些技巧的,否则容易出现问题,下面一一介绍. 方案1 public class UnsafeLazyInit{ private static Instance instance; public static Instance getInstance(){ if (instance == null){ instance…
一.什么是延迟初始化? 在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销. 延迟初始化实际上就是:当我们要进行一些高开销的对象初始化操作时,只有在使用这些对象时才进行初始化.最显著的意义在于,假如程序实际上不会用到这些类,那初始化它们的开销就会被完全避免. 二.延迟初始化的错误实现方式 1.线程不安全的延迟初始化 public class UnsafeLazyInitialization { private static Instance instance; pub…
1.大多数情况下,正常的初始化要优先于延迟初始化. private final FieldType field = computeFieldValue(); 2.如果利用延迟优化来破坏初始化的循环,就要使用同步访问方法,因为它是最简单.最清楚的替代方法. private FieldType field; synchronized FieldType getField(){ if(field == null){ field = computeFieldValue(); } return field…
一切真是有缘,上午刚刚看完单例模式,还在为其中的代码块同步而兴奋,下午就遇见这篇文章:双重检查锁定与延迟初始化.我一看,文章开头语出惊人,说这是一种错误的优化,我说,难道上午学的东西下午就过时了吗?仔细一看,发现了volatile的用处百度百科:violiate,而这正是上午我阅读时不得其解的地方,为什么要用这个呢,在<Head First设计模式>中只是简单说为了让多线程正确工作.而这篇文章,恰恰解决了我的这个疑惑,也就是uniqueInstance = new Instance()其实是分…
很好的文章,转自http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization 在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题.比如,下面是非线程安全的延迟初始化对象的示例代码: public class UnsafeLazyInitializat…
一.基本概念: 1.volatile是轻量级的synchronized,在多核处理器开发中保证了共享变量的“可见性”.可见性的意思是,当一个线程修改一个共享变量时,另一个线程能读到这个修改的值. 2.volatile在修饰共享变量进行写操作时,在多核处理器下会引发两件事情: 1)将当前处理器缓存行的数据写回到系统内存. 2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效. 3.在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议.每个处理器通过嗅探在总线上传播的…
3.3.1  延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean. Spring容器会在创建容器时提前初始化“singleton”作用域的Bean,“singleton”就是单例的意思即整个容器每个Bean只有一个实例,后边会详细介绍.Spring容器预先初始化Bean通常能帮助我们提前发现配置错误,所以如果没有什么情…
上一篇文章,讲到了很多Android应用开发中需要注意的性能和内存方面的技巧.这一篇文章就是从smali指令级来分析性能优化和内存优化的问题. 如何解决界面启动时间开销大的问题 我们在编写Android应用的时候,很多情况下会遇到界面启动时间过长的问题,用户体验非常的不好.所以我们在编写代码的时候,一定要多加注意如何提高界面的启动时间.下面会讲到几个优化界面启动开销的技巧. 1.类的加载开销 当一个类的静态方法或者静态属性被调用或者类被实例化得时候,虚拟机首先做的第一件事情就是DexClassL…