博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么enum枚举实现单例模式天然线程安全?
阅读量:3952 次
发布时间:2019-05-24

本文共 1300 字,大约阅读时间需要 4 分钟。

定义枚举时使用 enum 和 class 一样, 是 Java 中的一个关键字。 就像 class 对应一个 Class 类一样, enum 也对应有一个 Enum 类

通过将定义好的枚举反编译, 我们就能发现, 其实枚举在经过 javac 的编译之后, 会被转换成形如 public final class T extends Enum 的定义。
而且, 枚举中的各个枚举项通过 static 来定义的。 如:

public enum T {
SPRING,SUMMER,AUTUMN,WINTER;}

反编译后代码为:

public final class T extends Enum {
//省略部分内容 public static final T SPRING; public static final T SUMMER; public static final T AUTUMN; public static final T WINTER; private static final T ENUM$VALUES[];枚举类型和泛型 < 228 static {
SPRING = new T("SPRING", 0); SUMMER = new T("SUMMER", 1); AUTUMN = new T("AUTUMN", 2); WINTER = new T("WINTER", 3); ENUM$VALUES = (new T[] {
SPRING, SUMMER, AUTUMN, WINTER }); }}

1.枚举类型T不可被继承

2.T中所有属性都被 static final 修饰,天然支持多线程,原因如下:

了解 JVM 的类加载机制的朋友应该对这部分比较清楚。 static 类型的属性会在类加载过程初始化, 当一个 Java 类第一次被真正使用到的时候静态资源被初始化、 Java 类的加载和初始化过程都是线程安全的( 因为虚拟机在加载枚举的类的时候, 会使用 ClassLoader 的 loadClass 方法, 而这个方法使用同步代码块保证了线程安全) 。

所以, 创建一个 enum 类型是线程安全的。

也就是说, 我们定义的一个枚举, 在第一次被真正用到的时候, 会被虚拟机加载并初始化, 而这个初始化过程是线程安全的

而我们知道, 解决单例的并发问题, 主要解决的就是初始化过程中的线程安全问题

所以, 由于枚举的以上特性, 枚举实现的单例是天生线程安全的。

同时,enum单例模式也支持序列化/反序列化

在序列化的时候 Java 仅仅是将枚举对象的 name 属性输出到结果中,

反序列化的时候则是通过 java.lang.EnumvalueOf 方法根据名字查找枚举对象

同时, 编译器是不允许任何对这种序列化机制的定制的, 因此禁用了 writeObject、 readObject、 readObjectNoData、 writeReplace 和 readResolve 等方法。

转载地址:http://xjkzi.baihongyu.com/

你可能感兴趣的文章
快讯丨工信部发布《促进新一代人工智能产业发展三年行动计划(2018-2020年)》
查看>>
微信跳一跳技术手段高分秘籍;竟还可以伪造POST请求刷分
查看>>
【含代码】Python爬虫实战:爬取全站小说排行榜
查看>>
总结过去2017年最受欢迎的十大机器学习Python库
查看>>
恕我直言,你可能被支付宝账单预测关键词骗了!
查看>>
2018年春运火车票今天开售,手把手教你用Python抢票回家过年....
查看>>
【精华】大数据在营销中的6大优势
查看>>
炫!把你的生活轨迹用大数据展示后.......惊呆了~
查看>>
透过震惊世界的数据,探索中国数字化生态及潜力
查看>>
开发者必读:计算机科学中的线性代数(附论文)
查看>>
大数据下的帝都魔都的爱恨情仇
查看>>
GitHub最著名的20个Python机器学习项目!
查看>>
小白都能看懂的神经网络入门,快收下吧~
查看>>
这十大挑战,摆在深度学习面前(附论文)
查看>>
用Python分析李小璐微博.........贾乃亮到底.........
查看>>
教你用一行Python代码实现并行(附代码)
查看>>
Google发布了2017年最常被搜索的一个词,竟然看哭了几亿人
查看>>
学习 Python 编程的 19 个资源
查看>>
收藏!超全机器学习资料合集!(附下载)
查看>>
搞笑动图:这些痛,只有程序员懂…
查看>>