Lazy initialization holder class模式,这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙的同时实现了延迟加载和线程安全。
一、先来看点相应的基础知识
先简单的看看类级内部类相关的知识
- 1、什么是类级内部类?
简单点说,类级内部类指的是:有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。
- 2、类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。
- 3、类级内部类中,可以定义静态的方法,在静态方法中只能够引用外部类中的静态成员方法或者成员变量。
- 4、类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载。
再来看看多线程缺省同步锁的知识
大家都知道,在多线程开发中,为了解决并发问题,主要是通过使用synchronized来加互斥锁进行同步控制。但是在某些情况中,JVM已经隐含地为您执行了同步,这些情况下就不用自己再来进行同步控制了。这些情况包括:
- 1、由静态初始化器(在静态字段上或 static{} 块中的初始化器)初始化数据时
- 2、访问 final 字段时
- 3、在创建线程之前创建对象时
- 4、线程可以看见它将要处理的对象时
二、接下来看看这种解决方案的思路
要想很简单的实现线程安全,可以采用静态初始化器的方式,它可以由JVM来保证线程安全性。比如前面的“饿汉式”实现方式,但是这样一来,不是会浪费一定的空间吗?因为这种实现方式,会在类装载的时候就初始化对象,不管你需不需要。
如果现在有一种方法能够让类装载的时候不去初始化对象,那不就解决问题了?一种可行的方式就是采用类级内部类,在这个类级内部类里面去创建对象实例,这样一来,只要不使用到这个类级内部类,那就不会创建对象实例。从而同时实现延迟加载和线程安全。
看看代码示例可能会更清晰,示例代码如下:
public class Singleton {
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
仔细想想,是不是很巧妙呢!
当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会被虚拟机在装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。
分享到:
相关推荐
在这个场景中,我们关注的是"hibernate的lazy策略forClass",这涉及到如何对类的属性进行懒加载配置。 首先,我们需要理解Hibernate中的实体类(Entity)。在Hibernate中,一个Java类可以被映射为数据库中的一个表...
Lazy initialization holder class 模式是指使用类级的内部类来实现延迟加载,下面是代码示例: ```java public class Singleton3 { / * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 ...
3. **技术革新**:哈斯克尔引入了许多创新特性,如惰性求值(lazy evaluation)、类型推断(type inference)、高级数据类型(advanced data types)和模块系统(module system)等,这些特性极大地提高了程序的效率...
Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...
在上面的代码中,`data-src` 是图片的真实路径,而 `class="lazy"` 标记了这些图片需要懒加载。当页面加载完成后,`$(function() {...})` 包裹的代码会执行,调用 `.lazyload()` 方法初始化懒加载。 `lazyload.js` ...
2. **基本使用**:为需要懒加载的元素添加`data-src`属性,用以存储真实图片URL,同时添加`class="lazy"`标识该元素。例如: ```html <img data-src="path/to/image.jpg" class="lazy"> ``` 在文档加载完成后,...
在.NET框架中,`Lazy<T>`是一个非常有用的类,它实现了延迟初始化(Lazy Initialization)模式。这个模式的主要目的是推迟对象的创建,直到第一次真正需要它时才进行实例化,这样可以提高程序性能,特别是对于那些...
Lazy
在.NET框架中,`System.Lazy<T>`是一个强大的工具,用于实现延迟初始化(Lazy Initialization)。延迟初始化是一种设计模式,它推迟对象的创建或资源的加载,直到第一次真正需要它们时。这种方式可以提高程序的性能...
<img class="lazyload" data-src="image.jpg" alt="Lazyloaded Image"> ``` ### 4. 初始化 Lazyload 在文档加载完成后,需要调用 Lazyload 的初始化方法: ```javascript $(function() { $("img.lazyload").lazy...
<img class="lazyload" data-src="image.jpg"> ``` 最后,调用jQuery.Lazyload插件并进行必要的配置: ```javascript $("img.lazyload").lazyload(); ``` 如果需要,还可以通过配置项来设定各种行为,如设置加载占位...
<img class="lazyload" data-src="path/to/your/image.jpg" alt="延迟加载图片"> ``` 3. **初始化插件**:在文档加载完成后,调用 jQuery.lazyload 的初始化方法,设置必要的选项。 ```javascript $(function...
在.NET框架中,C#语言提供了许多特性来帮助开发者优化应用程序的性能,其中之一就是`Lazy<T>`类。这个类主要用于实现延迟加载(Lazy Loading),它允许我们推迟对象的初始化,直到真正需要使用该对象时才会执行初始...
<img data-src="path/to/image.jpg" class="lazyload" alt="懒加载图片"> ``` 2. **JavaScript配置**:引入`lazyload.js`和`jquery.js`,确保jQuery库已经加载。然后,通过调用`lazyload`函数来初始化插件: ```...
标题提到的"LazyUI-dependency"表明这是一个关于懒加载用户界面(LazyUI)的依赖集合,可能是为了帮助开发者更方便地集成到自己的项目中,尤其是对于那些不熟悉或者不喜欢使用Maven进行依赖管理的开发者。...
<img src="placeholder.gif" data-src="actual-image.jpg" class="lazyload"> ``` 3. **初始化 LazyLoad**:在文档加载完成后,调用 LazyLoad 初始化函数。 ```javascript $(document).ready(function() { $...
jQuery_lazyload是一个非常实用的JavaScript库,用于优化网页性能,特别是在处理大量图片或者内容时。这个插件的主要目的是延迟加载,即在用户滚动到页面的特定部分时才加载那些可视区域以外的内容,从而减少初次...
**懒加载技术与lazyload.js详解** 懒加载(Lazy Load)是一种优化网页性能的技术,它主要应用于图片或视频等大容量资源的加载。在网页初次加载时,仅加载视口内的内容,当用户滚动页面或者靠近某个元素时,再加载...
Lazy Initialization Holder Class(延迟初始化持有类) 另一种实现线程安全的单例模式的方法是使用静态内部类。这种方式利用了Java类加载机制的特性来保证初始化的线程安全性,同时又延迟了单例的初始化过程。 `...
In this article I want to discuss the lazy loading mechanism provided by NHibernate. It is recommended for maximum flexibility to define all relations in your domain as lazy loadable. This is the ...