initialization on demand holder
以前看到过这种写法,但是不知道为什么这么写:
public class Singleton
{ private static class SingletonHolder { public final static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; }
}
今天在Spring in action 这本书上看到这个写法是initialization on demand holder模式,所以深入了解了下,感觉学习真的是无止尽。对于单例模式的认识也有一个渐进的过程。
一开始的时候,对于单例模式的认识仅限于饥饿模式和饱汉模式。
后来,引入了多线程,原来的写法就不够用了,然后就对整个方法加同步锁。
public class Singleton { private static Singleton singleton= null; public static Synchronized Singleton getInstance() { if(singleton== null){singleton = new Singleton();}return singleton; } }
但是上面的方法同步了整个方法块,导致性能不高,然后引入双重加锁机制。
public final class DoubleCheckedSingleton { private static DoubleCheckedSingletonsingObj = null; private DoubleCheckedSingleton(){ } public static DoubleCheckedSingleton getSingleInstance(){ if(null == singObj ) {Synchronized(DoubleCheckedSingleton.class){if(null == singObj)singObj = new DoubleCheckedSingleton();}}return singObj;} }
但是上面的方式还是存在一个问题,就是singObj正在初始化的时候,singObj已经不为空了,但是还没有完全初始化好,所以有可能返回一个不完整的对象。
最后还是使用initialization on demand holder模式好点。代码整洁干净,没有任何显式同步的痕迹。
参考链接
initialization on demand holder相关推荐
- 技术图文:02 创建型设计模式(下)
创建型设计模式(下) 知识结构: 图1 知识结构 单例模式 – 确保对象的唯一性 Sunny 软件公司承接了一个服务器负载均衡软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量 ...
- java设计模式 单例_java设计模式一(单例模式singleton)
1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...
- Java 单例模式探讨
以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...
- 单例-双重检查锁定与延迟初始化
在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题. ...
- 菜鸟之路-浅谈设计模式之单例设计模式
单例设计模式 定义:确保一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统 ...
- 确保对象的唯一性——单例模式
本文转载自 :http://blog.csdn.net/lovelion/article/details/7420883 3.1 单例模式的动机 对于一个软件系统的某些类而言,我们无须创建多个实例.举 ...
- Java 中的双重检查(Double-Check)
转载自 Java 中的双重检查(Double-Check) 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下 ...
- java单例模式之线程安全问题
单例的目的是为了保证运行时Singleton类只有唯一的一个实例,用于一些较大开销的操作. 饿汉式(没有线程安全问题): ' 由于使用static关键字进行了修饰,只能获取到一个对象,从而达到了单例, ...
- java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...
3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...
- singleton pattern的推荐实现
一.单例模式的C#实现: (1)使用double-checked locking的方式: public sealed class Singleton {private static volatile ...
最新文章
- 矩阵变换应用-求演化矩阵
- R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)
- VB操作excel文件
- 移植uboot第九步:支持yaffs映像烧写
- urllib使用cookies(下载,提取)
- Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】
- sparksql(2)——dataframe的ap-printSchema、withColum、count、drop、describe、select
- php网页 安装插件,插件安装流程
- Java(19)JDBC
- Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
- 今日恐慌与贪婪指数为92 贪婪程度与昨日持平
- LetNet5卷积参数理解
- centos安装python3、redis和虚拟环境
- 浅分享一下zzulioj刷题总结
- ref:使用Dezender对zend加密后的php文件进行解密
- 850pro测试软件,新极速霸主诞生 三星850 PRO首发评测
- ubuntu shuru zhic
- LeetCode第四天--罗马数字转整数
- UE4 后期处理 PostProcess
- TUSCANY 学习笔记1