`
zsk_china
  • 浏览: 25796 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Lazy initialization holder class(转载)

 
阅读更多
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的lazy策略forClass",这涉及到如何对类的属性进行懒加载配置。 首先,我们需要理解Hibernate中的实体类(Entity)。在Hibernate中,一个Java类可以被映射为数据库中的一个表...

    22种开发模式

    Lazy initialization holder class 模式是指使用类级的内部类来实现延迟加载,下面是代码示例: ```java public class Singleton3 { / * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 ...

    A History of Haskell - Being Lazy With Class

    3. **技术革新**:哈斯克尔引入了许多创新特性,如惰性求值(lazy evaluation)、类型推断(type inference)、高级数据类型(advanced data types)和模块系统(module system)等,这些特性极大地提高了程序的效率...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    懒加载lazyload

    在上面的代码中,`data-src` 是图片的真实路径,而 `class="lazy"` 标记了这些图片需要懒加载。当页面加载完成后,`$(function() {...})` 包裹的代码会执行,调用 `.lazyload()` 方法初始化懒加载。 `lazyload.js` ...

    lazyload-2.x.zip

    2. **基本使用**:为需要懒加载的元素添加`data-src`属性,用以存储真实图片URL,同时添加`class="lazy"`标识该元素。例如: ```html <img data-src="path/to/image.jpg" class="lazy"> ``` 在文档加载完成后,...

    Lazy.Object.Initialize

    在.NET框架中,`Lazy<T>`是一个非常有用的类,它实现了延迟初始化(Lazy Initialization)模式。这个模式的主要目的是推迟对象的创建,直到第一次真正需要它时才进行实例化,这样可以提高程序性能,特别是对于那些...

    Lazy

    Lazy

    System.Lazy 实例的延迟初始化值

    在.NET框架中,`System.Lazy<T>`是一个强大的工具,用于实现延迟初始化(Lazy Initialization)。延迟初始化是一种设计模式,它推迟对象的创建或资源的加载,直到第一次真正需要它们时。这种方式可以提高程序的性能...

    JQuery Lazyload加载图片实例

    <img class="lazyload" data-src="image.jpg" alt="Lazyloaded Image"> ``` ### 4. 初始化 Lazyload 在文档加载完成后,需要调用 Lazyload 的初始化方法: ```javascript $(function() { $("img.lazyload").lazy...

    jquery.lazyload.js

    <img class="lazyload" data-src="image.jpg"> ``` 最后,调用jQuery.Lazyload插件并进行必要的配置: ```javascript $("img.lazyload").lazyload(); ``` 如果需要,还可以通过配置项来设定各种行为,如设置加载占位...

    图片延迟加载 lazyload

    <img class="lazyload" data-src="path/to/your/image.jpg" alt="延迟加载图片"> ``` 3. **初始化插件**:在文档加载完成后,调用 jQuery.lazyload 的初始化方法,设置必要的选项。 ```javascript $(function...

    C#使用Lazy延迟加载

    在.NET框架中,C#语言提供了许多特性来帮助开发者优化应用程序的性能,其中之一就是`Lazy<T>`类。这个类主要用于实现延迟加载(Lazy Loading),它允许我们推迟对象的初始化,直到真正需要使用该对象时才会执行初始...

    lazyload使用案例及DEMO

    <img data-src="path/to/image.jpg" class="lazyload" alt="懒加载图片"> ``` 2. **JavaScript配置**:引入`lazyload.js`和`jquery.js`,确保jQuery库已经加载。然后,通过调用`lazyload`函数来初始化插件: ```...

    LazyUI-dependency

    标题提到的"LazyUI-dependency"表明这是一个关于懒加载用户界面(LazyUI)的依赖集合,可能是为了帮助开发者更方便地集成到自己的项目中,尤其是对于那些不熟悉或者不喜欢使用Maven进行依赖管理的开发者。...

    jquery lazyload延时加载

    <img src="placeholder.gif" data-src="actual-image.jpg" class="lazyload"> ``` 3. **初始化 LazyLoad**:在文档加载完成后,调用 LazyLoad 初始化函数。 ```javascript $(document).ready(function() { $...

    jQuery_lazyload

    jQuery_lazyload是一个非常实用的JavaScript库,用于优化网页性能,特别是在处理大量图片或者内容时。这个插件的主要目的是延迟加载,即在用户滚动到页面的特定部分时才加载那些可视区域以外的内容,从而减少初次...

    lazyload.js演示页面

    **懒加载技术与lazyload.js详解** 懒加载(Lazy Load)是一种优化网页性能的技术,它主要应用于图片或视频等大容量资源的加载。在网页初次加载时,仅加载视口内的内容,当用户滚动页面或者靠近某个元素时,再加载...

    JAVA中单例模式的几种实现方式.doc

    Lazy Initialization Holder Class(延迟初始化持有类) 另一种实现线程安全的单例模式的方法是使用静态内部类。这种方式利用了Java类加载机制的特性来保证初始化的线程安全性,同时又延迟了单例的初始化过程。 `...

    Lazy loading - eager loading

    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 ...

Global site tag (gtag.js) - Google Analytics