Lazy initialization holder class模式,这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙的同时实现了延迟加载和线程安全。
1:先来看点相应的基础知识
先简单的看看类级内部类相关的知识。
• 什么是类级内部类?
简单点说,类级内部类指的是:有static修饰的成员式内部类。如果没有static修饰的成员式内部类被
称为对象级内部类。
• 类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可直接创
建。而对象级内部类的实例,是绑定在外部对象实例中的。
• 类级内部类中,可以定义静态的方法,在静态方法中只能够引用外部类中的静态成员方法或者成员变
量。
• 类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载
再来看看多线程缺省同步锁的知识。
大家都知道,在多线程开发中,为了解决并发问题,主要是通过使用synchronized来加互斥锁进行同步控
制。但是在某些情况中,JVM已经隐含地为您执行了同步,这些情况下就不用自己再来进行同步控制了。这些
情况包括:
• 由静态初始化器(在静态字段上或 static{} 块中的初始化器)初始化数据时
• 访问 final 字段时
• 在创建线程之前创建对象时
• 线程可以看见它将要处理的对象时
2:接下来看看这种解决方案的思路
要想很简单的实现线程安全,可以采用静态初始化器的方式,它可以由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方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并
没有增加任何访问成本。
单例和枚举
按照《高效Java 第二版》中的说法:单元素的枚举类型已经成为实现Singleton的最佳方法。
为了理解这个观点,先来了解一点相关的枚举知识,这里只是强化和总结一下枚举的一些重要观点,更多
基本的枚举的使用,请参看Java编程入门资料:
• Java的枚举类型实质上是功能齐全的类,因此可以有自己的属性和方法
• Java枚举类型的基本思想:通过公有的静态final域为每个枚举常量导出实例的类
• 从某个角度讲,枚举是单例的泛型化,本质上是单元素的枚举
用枚举来实现单例非常简单,只需要编写一个包含单个元素的枚举类型即可,示例代码如下:
/**
* 使用枚举来实现单例模式的示例
*/
public enum Singleton {
/**
* 定义一个枚举的元素,它就代表了Singleton的一个实例
*/
uniqueInstance;
/**
* 示意方法,单例可以有自己的操作
*/
public void singletonOperation(){
//功能处理
}
}
使用枚举来实现单实例控制,会更加简洁,而且无偿的提供了序列化的机制,并由JVM从根本上提供保
障,绝对防止多次实例化,是更简洁、高效、安全的实现单例的方式。
分享到:
相关推荐
单例模式在实际开发中具有多种实现方式,每种方式都有其特点和应用场景。 #### 二、单例模式的特点 1. **全局唯一性**:确保在整个应用程序中只存在一个实例。 2. **对外提供唯一的访问点**:使得系统中的其他对象...
单例模式有两种常见的实现方式:饿汉式和懒汉式。 - 饿汉式(Eager Initialization):在类加载时就创建了单例对象,这种方式简单且线程安全,但可能会造成资源浪费,因为即使单例未被使用,也会在类加载时创建。 `...
单例模式是一种设计模式,它的核心思想是在整个应用程序中,保证一个类只有一个实例存在,并提供一个全局访问点。这样做的好处在于控制...在Java中,通过饿汉式、懒汉式以及静态内部类等方式可以有效地实现单例模式。
登记式单例是一种更高级的单例模式,它可以管理多个单例类。下面是一个登记式单例的实现示例: ```java public class RegSingleton { private static Map, RegSingleton> m_registry = new HashMap(); static { ...
### 23种JAVA设计模式和15种J2EE设计模式详解 #### 一、JAVA设计模式概览 在软件工程领域,设计模式是一种在特定情境下解决常见问题的有效方法。Java作为一种广泛使用的编程语言,拥有丰富的设计模式库来帮助...
本资源包含全部23种经典设计模式的Java实现,涵盖了Proxy(代理模式)、Singleton(单例模式)、Interpreter(解释器模式)以及FactoryMethod(工厂方法模式)等多种模式。 1. **Proxy模式**:此模式用于在不修改...
- **单例模式:** 在Java中可以通过私有构造函数、静态内部类等方式实现。 - **工厂模式:** 可以利用Java的接口和抽象类来定义产品接口,工厂类负责创建具体的产品实例。 - **DAO模式:** 使用Java的JDBC API或其他ORM...
通过静态类和静态方法等不同方式实现单例模式,并讨论了在大型程序中查找单例的方法。 - **建造者模式**(第37页):适用于需要构建复杂对象的情况,可以方便地构造不同类型的复杂对象。通过投资跟踪器的例子,演示...
单例模式(Singleton Pattern)确保一个类只有一个实例,并提供全局访问点;工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个;抽象工厂模式(Abstract Factory ...
例如,单例模式的实现通常通过私有构造函数、静态内部类或枚举等方式,确保类只有一个实例。工厂方法模式则通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,解耦了对象的创建和使用。装饰器模式允许动态...
例如,单例模式保证一个类只有一个实例,常用于配置中心或者线程池等场景。工厂模式提供了一种创建对象的接口,使得具体创建哪个类的对象可以在运行时决定,增强了代码的灵活性。装饰者模式可以在不修改对象原有功能...
这里通常会涉及到设计模式的分类,如创建型模式、结构型模式、行为型模式等,并且对于每一种模式,如单例模式、工厂方法模式、观察者模式等,都会详细介绍它们的概念、结构、使用场景和实现方式。学习这些基本的设计...
《java23种设计模式详细讲解》这本书系统地介绍了23种设计模式,并通过具体的例子来阐释每种模式的应用场景和实现方式,旨在帮助程序员提升设计能力,编写更优雅、可维护的代码。书中的内容涵盖了创建型模式、结构型...
首先,单例模式是一种限制类实例化次数的设计模式,确保一个类在整个应用中只有一个实例存在。通过私有构造器和静态工厂方法,可以防止外部直接创建对象,确保全局唯一性。单例模式在资源管理,如数据库连接池等场景...
3. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、观察者模式、装饰器模式、策略模式等,这些模式是解决软件开发中常见问题的通用解决方案。 4. **反射机制**:通过反射,可以在运行时动态地获取类的...
文档中虽然没有直接提到单例模式的代码实现,但是描述了单例模式的特点和用途。 从文件内容可以推断出,Java设计模式的学习可以帮助开发者构建更加合理、稳定、可维护的软件系统。由于文档内容的不完整性和扫描识别...
J2EE作为企业级计算应用的框架,其实现了很多设计模式的思想,如工厂模式、单例模式、观察者模式等。没有对设计模式的了解,理解J2EE的底层实现和灵活运用将变得困难。因此,对于想要深入J2EE领域的开发者来说,学习...
- 创建型模式:单例模式、工厂模式、建造者模式、原型模式等,以及它们在实际项目中的应用。 - 结构型模式:适配器模式、装饰器模式、代理模式、桥接模式、组合模式等。 - 行为型模式:策略模式、观察者模式、...
- 单例模式、工厂模式、装饰器模式、代理模式等23种设计模式的应用与理解。 - 模式在实际项目中的实践,提高代码可读性和可维护性。 6. **Java高级特性** - Lambda表达式:函数式编程的概念和Java 8中的应用。 ...
创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)和建造者模式(Builder)等,它们主要解决了对象实例化过程中的各种问题。结构型模式则涉及如何...