常见单例设计模式的对比分析
来源:互联网 发布:cdn加速域名 编辑:程序博客网 时间:2024/06/15 18:07
单例设计模式
//饿汉式
public class Singleton01 {
//1.私有的静态的变量
privatestatic Singleton01 instance=new Singleton01();
//2.私有的构造器
privateSingleton01(){}
//3.共有的get()方法
publicstatic Singleton01 getInstance(){
returninstance;
}
}
//懒汉式
public class Singleton02 {
//1.私有的静态的变量
privatestatic Singleton02 instance;
//2.私有的构造器
privateSingleton02(){
if(instance!=null){
thrownew RuntimeException();//防止反射和反序列化漏洞
}
}
//3.公有get方法
publicstatic synchronized Singleton02 getInstance(){
//要防止线程同步
if(null==instance){
returnnew Singleton02();//延时加载
}
returninstance;
}
}
//静态内部类,兼备了高效调用和延迟加载的优势
public class Singleton03 {
//外部类没有static属性,则不会像饿汉式那样立即加载对象
privatestatic class SingletonClassInstance{
privatestatic final Singleton03 instance=new Singleton03();
}
//只有真正调用getInstance(),才会加载静态内部类。加载类时是线程安全的。instance是static final类型
//保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性
publicstatic Singleton03 getInstance(){
returnSingletonClassInstance.instance;
}
privateSingleton03(){}
}
1. 饿汉式是天然的线程安全的,但是没有延迟加载的优势。饿汉式之所以是天然的线程安全,是因为:
一个字节码文件被加载到内存会经历以下过程:
1、链接(1、验证2、准备3、解析)
2、初始化
3、使用
4、卸载
初始化是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static)中的语句合并产生的。在这个过程中instance已经被实例化了。并且虚拟机JVM会保证一个类的<clinit>()方法在多线程的环境中被正确加锁和同步。因此他是天然线程安全的。
2. 懒汉式具有延迟加载的优势,但是一般的懒汉式线程都不安全,而且有反射和反序列化的的漏洞,如上所写便可防止反射反序列化的漏洞,而且线程安全,但是这样一来调用效率变得很低。
3. 静态内部类具有线程安全、延迟加载的优势目前也比较常用到
- 常见单例设计模式的对比分析
- 【设计模式】单例模式的常见应用场景
- Android常见的设计模式----单例模式
- Android常见的设计模式一:单例模式
- Java中常见的设计模式 单例模式
- 阅读笔记常见的设计模式之一:单例模式
- PHP常见的设计模式之:单例模式
- 常见设计模式之【单例模式】
- 常见设计模式-单例模式
- 单例设计模式的几种常见实现方法
- 单例模式常见的应用场景分析
- 单例模式及常见写法分析(设计模式01)
- 单例模式及常见写法分析(设计模式01)
- Java设计模式之单例模式的分析
- 设计模式—单例模式分析
- Java中常见的设计模式之单例设计模式
- 常见的几种设计模式——单例设计模式
- JAVA设计模式之常见模式-单例模式
- eclipse导入工程失败解决方法
- 机器学习实战k-近邻算法(kNN)应用之改进婚恋网站配对效果代码解
- 为什么Lisp语言如此先进?
- SmartConfig 技术原理
- Android 自定义水波,touch和move状态下触发 (玩具)
- 常见单例设计模式的对比分析
- Otter(二)---了解zookeeper
- OMPL138及U-Boot的启动过程分析(三)
- 将Java Project (非web项目)打成Jar包并实现相关功能
- Hibernate+Freemarker分页控件实现
- Extjs中ajax请求当session失效时自动跳转
- TCP 的那些事儿(上)
- Dell PowerEdge R710在Red Hat 6.2安装OpenManage Server Administrator
- MySQL Connector/C++ 开发者指南简要阅读