以前看到过这种写法,但是不知道为什么这么写:

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相关推荐

  1. 技术图文:02 创建型设计模式(下)

    创建型设计模式(下) 知识结构: 图1 知识结构 单例模式 – 确保对象的唯一性 Sunny 软件公司承接了一个服务器负载均衡软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量 ...

  2. java设计模式 单例_java设计模式一(单例模式singleton)

    1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...

  3. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  4. 单例-双重检查锁定与延迟初始化

    在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题. ...

  5. 菜鸟之路-浅谈设计模式之单例设计模式

    单例设计模式 定义:确保一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统 ...

  6. 确保对象的唯一性——单例模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/7420883 3.1 单例模式的动机 对于一个软件系统的某些类而言,我们无须创建多个实例.举 ...

  7. Java 中的双重检查(Double-Check)

    转载自    Java 中的双重检查(Double-Check) 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下 ...

  8. java单例模式之线程安全问题

    单例的目的是为了保证运行时Singleton类只有唯一的一个实例,用于一些较大开销的操作. 饿汉式(没有线程安全问题): ' 由于使用static关键字进行了修饰,只能获取到一个对象,从而达到了单例, ...

  9. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...

    3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...

  10. singleton pattern的推荐实现

    一.单例模式的C#实现: (1)使用double-checked locking的方式: public sealed class Singleton {private static volatile ...

最新文章

  1. 矩阵变换应用-求演化矩阵
  2. R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)
  3. VB操作excel文件
  4. 移植uboot第九步:支持yaffs映像烧写
  5. urllib使用cookies(下载,提取)
  6. Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】
  7. sparksql(2)——dataframe的ap-printSchema、withColum、count、drop、describe、select
  8. php网页 安装插件,插件安装流程
  9. Java(19)JDBC
  10. Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
  11. 今日恐慌与贪婪指数为92 贪婪程度与昨日持平
  12. LetNet5卷积参数理解
  13. centos安装python3、redis和虚拟环境
  14. 浅分享一下zzulioj刷题总结
  15. ref:使用Dezender对zend加密后的php文件进行解密
  16. 850pro测试软件,新极速霸主诞生 三星850 PRO首发评测
  17. ubuntu shuru zhic
  18. LeetCode第四天--罗马数字转整数
  19. UE4 后期处理 PostProcess
  20. TUSCANY 学习笔记1

热门文章

  1. 计算机03年word做母亲节贺卡,word2007怎样制作电子母亲节贺卡
  2. 现在的技术人啊,1小时200的活都看不上了吗?
  3. python 列表、元组、字典、集合
  4. 毕业旅行之天府之国——徒步峨眉
  5. java ajax 读取流_javascript-如何使用AJAX读取实时流数据
  6. 柳州哪里有短视频创业直播基地?柳州市互联网协会为您精选4家
  7. attitude determines altitude 态度决定高度
  8. Android 之简易涂鸦板
  9. Java成员变量初始化顺序
  10. linux网桥中stp分析,linux网桥中stp分析