枚举实现单例原理
最近因为⼯作需要需要实现单例模式,考虑到单例模式最简单的实现⽅式是枚举实现,因此研究了下枚举实现单例模式的原理,下⾯将从原理、详解两个步骤说明:
⼀:原理
1、单例模式利⽤了() ⽅法在类加载的过程中线程安全的实例化了⼀个实例;
【 () 是由编译器⾃动收集类中的所有类变量(static)的赋值动作和静态语句块(static{})块中的语句合并产⽣的。因此,private static Singleton singleton = new Singleton();也会被放⼊到这个⽅法中。】
2、枚举类的构造器是private私有的,保障了内存中只有枚举的⼀个实例;
⼆:详解
1)、为什么说枚举实例是单例且线程安全的?
就拿枚举来说,其实Enum就是⼀个普通的类,它继承⾃`java.lang.Enum类。
public enum SingletonEnum{
单例模式的几种实现方式
SINGLETON;
}
对Singleton进⾏反编译可以得到如下java类:
public final class SingletonEnum extends Enum<SingletonEnum> {
public static final SingletonEnum SINGLETON;
public static SingletonEnum[] values();
public static SingletonEnum valueOf(String s);
static {};
}
由反编译后的代码可知,SINGLETON被声明为 static 的【 public static final SingletonEnum SINGLETON<==>public static final SingletonEnum SINGLETON = New SingletonEnum ();】,所以,枚举实现是在实例化时是线程安全。
2)、如何保证枚举实例的单例?
⾸先
public enum SingletonEnum{
SINGLETON;
}
的实质是:
public enum SingletonEnum{
SINGLETON;
......
private SingletonEnum(){......}
}
因此外部⽆法通过构造器创建枚举类的实例,这也是枚举类通常⽤来保存常量的⼀个原因之⼀。
其次,枚举类的实例会在类加载的时候线程安全的进⾏初始实例化,在类加载的时候,
综上所述,枚举保证了枚举实例的线程安全和单例性;
参考⽂章:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论