单例可以用枚举类来实现,且线程安全。那么,为什么它就是线程安全的呢?设计一个枚举类Day.java
文件,如下:
//定义枚举类型
public enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
执行如下命令:
javac Day.java
, 生成 Day.class
。
直接cat 查看该class文件的话,会发现其乱码。
反编译该class文件:javap -c Day.class
结果如下:
public final class Day extends java.lang.Enum<Day> {
public static final Day MONDAY;
public static final Day TUESDAY;
public static final Day WEDNESDAY;
public static final Day THURSDAY;
public static final Day FRIDAY;
public static final Day SATURDAY;
public static final Day SUNDAY;
public static Day[] values();
Code:
0: getstatic #1 // Field $VALUES:[LDay;
3: invokevirtual #2 // Method "[LDay;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[LDay;"
9: areturn
...(省略)
简要分析
该类Day.java
是继承了Enum
类的,同时被final关键字
修饰:这个类是不能被继承的。
同时,
所以,创建一个enum类型
是线程安全的。
扩展
为什么说enum在序列化、反序列化的时候特殊性
参考地址: 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题 - 方丈的博客 - CSDN博客
idea 反编译插件
插件名:asm bytecode outline
如上图所示操作,即可显示出如上图右侧的反编译后的代码。