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

内部类和单例

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


演示代码如下:


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





单例和枚举

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

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


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

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

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





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

你可能感兴趣的:(006-单例模式(更好的实现方式:内部类和枚举))