006-单例模式(更好的实现方式:内部类和枚举)

内部类和单例

懒汉式和饿汉式都存在小小的缺陷,有没有一种更好的方案,既能实现延迟加载,又能实现线程安全呢?解决方案是Lazy initialization holder calss模式,这个模式综合了Java 的类级内部类和多线程默认同步锁的知识,很巧妙的同时实现了延迟加载和线程安全。


演示代码如下:


当getInstance第一次被调用时,才第一次读取ClassSingletonHolder.instance,导致ClassSingletonHolder得到初始化,而这个类初始化时,会初始化静态域instance,从而创建ClassSingleton对象,由于是静态域,因此只会被虚拟机在装载类的时候初始化一次,并由虚拟机保证它的线程安全。





单例和枚举

单元素的枚举类是实现单例的最佳方式。

Java的枚举类本身也是功能齐全的类,有自己的属性和方法,因此也可以作为一般的类使用。枚举类的基本思想是通过共有的静态final域为每个枚举常量导出实例的类。


使用枚举来实现单例非常简单,只需要编写一个包含单个元素的枚举类即可,演示代码如下:

可以看到上面极其简单的代码在枚举中实现了单例,获取实例的话,可以直接使用类名加属性。

枚举实现单例不仅更加简洁,而且无偿提供序列化的机制,并有jvm从根本上提供保障,绝对防止多次实例化,是更简洁高效安全的实现单例的方式。





代码:https://gitee.com/blueses/design-pattern

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,795评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,425评论 11 349
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,790评论 1 32
  • 步骤: 1,点击"猫堡服务"。 2,点击"我要上课",再点击"猫堡大课堂"。 3,点击"查看更多我参与的"。 4,...
    清凉_虫子阅读 4,379评论 0 1