使用静态内部类实现延迟加载单例模式
来源:互联网 发布:广州网络推广培训 编辑:程序博客网 时间:2024/05/17 09:14
所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在。就像是Java Web中的application,也就是提供了一个全局变量。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类就称为单例类。
单例的创建一般分为懒汉式,恶汉式,双重锁检查,枚举等,其中双重锁检查只能在jdk1.5以后才能有效,1.5以前在java对象模型中的无序写问题不能保证。
下面就介绍使用内部类的机制来巧妙实现懒汉式单例模式的实现 :Lazy initialization holder class模式
这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙地同时实现了延迟加载和线程安全。同时不受jdk版本的影响。
内部类简单介绍
内部类分为对象级别和类级别,类级内部类指的是,有static修饰的成员变量的内部类。如果没有static修饰的成员变量的内部类被称为对象级内部类。
类级内部类相当于其外部类的static成员,它的对象与外部类对象间不存在依赖关系,相互独立,因此可直接创建。而对象级内部类的实例,是必须绑定在外部对象实例上的。类级内部类只有在第一次被使用的时候才被会装载。
要想很简单地实现线程安全,可以采用静态初始化器的方式,它可以由JVM来保证线程的安全性,如恶汉式单例,这种实现方式,会在类装载的时候就初始化对象,有可能浪费一定的内存(假设你不需要的话),有一种方法能够让类装载的时候不去初始化对象,就是采用类级内部类,在这个类级内部类里面去创建对象实例。
代码如下:
1
2
3
4
5
6
7
8
9
10
public class SingletonIniti {
private SingletonIniti() {
}
private static class SingletonHolder {
private static final SingletonIniti INSTANCE = newSingletonIniti();
}
public static SingletonIniti getInstance() {
return SingletonHolder.INSTANCE;
}
}
当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,内部类SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。
- 使用静态内部类实现延迟加载单例模式
- 【J2SE】为什么静态内部类的单例可以实现延迟加载
- 使用静态内部类实现单例模式
- 静态内部类实现单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 单例模式实现延迟加载在多线程下的思考(双检锁和内部类)
- 设计模式之使用静态块,静态内部类,枚举类实现单例模式
- 单例模式中采用的延迟加载创建单例(内部类)
- 内部类加载顺序及静态内部类单例模式
- Java单例模式——静态内部类实现
- 单例模式静态内部类实现线程安全。
- 单例模式-静态内部类的实现(线程安全)
- 静态内部类实现单例设计模式
- 利用静态内部类实现的单例模式
- JVM堆内存分块
- C#获取网页的HTML码,下载网站图片
- Spring官方文档翻译(7章)
- 利用jdom.jar导出成.xml文件,并压缩,并下载所压缩的文件
- 大数据的概念
- 使用静态内部类实现延迟加载单例模式
- maven Tomcat7 xml文件配置
- Delphi ControlBar Coolbar的使用
- 在注册时要用户发送一封激活邮件,结果显示 550 User has no permission
- pache-tomcat-7.0.75-windows-x64.zip安装与配置
- LeetCode-475. Heaters
- Android:真机调试遇到的问题(You need to use a Theme.AppCompat theme (or descendant) with this activity)
- 打印日期(简单模拟)
- Android 上传图片到服务器