定义枚举时使用 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[];枚举类型和泛型 < 228static{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 等方法。

为什么enum枚举实现单例模式天然线程安全?相关推荐

  1. ios 获取一个枚举的所有值_Java enum枚举在实际项目中的常用方法

    在项目实际开发过程中,经常会遇到对某些固定的值.字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项 ...

  2. linux 单例模式改密码,Java 利用枚举实现单例模式

    引言 单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法. Java枚举 基本用法 枚举的用法比较多,本文主要旨在介绍利用枚 ...

  3. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  4. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例

    场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...

  5. java 枚举与单例模式_今天我们来聊聊单例模式和枚举

    ㊣java编程核心第2版多线程的图书 75.5元 包邮 (需用券) 去购买 > 曾经面试的时候,在说到单例模式的时候,我还是含含糊糊的,我觉得自己懂,但是又在某个结点被卡死了,所以决定写篇文章来 ...

  6. java枚举类及面试题为什么枚举实现单例模式是安全的?

    目录 枚举类 为什么会有枚举类? 枚举类的使用 枚举类的常用方法 枚举的构造 枚举类型能被反射吗? 为什么枚举实现单例模式是安全的? 枚举类的优缺点 枚举类 为什么会有枚举类? 假如说程序中有一些颜色 ...

  7. java enum枚举类的用法以及高级玩法

    enum(枚举)类介绍 java枚举类是一组预定义常量的集合,使用enum关键字声明这个类,常量名称官方建议大写 1.enum类基本用法 举一个常见的例子,例如星期就可以描述为一个枚举类,如下 pub ...

  8. 枚举类型为什么是线程安全的?为什么反序列化枚举类型也不会创建新的实例?

    枚举类型为什么是线程安全的? 我们定义的一个枚举,在第一次被真正用到的时候,会被虚拟机加载并初始化,而这个初始化过程是线程安全的.而我们知道,解决单例的并发问题,主要解决的就是初始化过程中的线程安全问 ...

  9. C enum(枚举)

    本文转载自:C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,--}; 接下来我们举个例子,比 ...

最新文章

  1. 来看看企业如何拥抱混合云?
  2. 通过安装scl软件集,使用高版本gcc的方法
  3. LAMP之Apache
  4. Spring+SpringMVC+Mybatis框架整合流程
  5. 省选+NOI 第五部分 高级数据结构
  6. 教育|我在美国读博士才发现,美国高等教育如此残酷,以前的感觉完全是扯淡...
  7. XDebug On Ubuntu
  8. (转)MapReduce二次排序
  9. 设计模式-第五篇之命令模式
  10. SQL server 2008 r2导入数据
  11. 亚马逊awsome day_亚马逊Prime Day交易上线时如何获得警报
  12. javaweb验证码明明输入正确却还是提示错误,验证码session不同步、不一致问题
  13. axios封装需要注意的增删改查传参易混淆点
  14. Android 使用Service 实现的简易音乐播放器(有播放、暂停(继续)、重播、停止)
  15. 我帮你踩坑:ubuntu18.04 docker换源
  16. KYC (Know Your Customer) 详述篇 下
  17. C# winform 编写一键排班软件时遇到的问题
  18. Cwru轴承数据集解读(文末附数据)
  19. 3、Pull解析、SQLite、单元测试、ListView
  20. 北京联通2013年夏天大规模促销IPTV 与光纤宽带提速同步推进

热门文章

  1. crontab的使用方法介绍
  2. php diy明信片代码,教你用ps简单制作明信片
  3. 正确开启Mockjs的三种姿势:入门参考(一)
  4. MySQL 实现一个简单版搜索引擎,真是绝了!
  5. python编写递归函数m(i)计算以下级数_编写递归函数getpower
  6. pycharm但多行注释快捷键
  7. 分享海报以及微信模板消息推送
  8. hdu2602 骨头收集者 01背包 模板题
  9. jmeter学习记录(3)jmeter中如何引用变量?
  10. 微信小程序开发之选项卡(窗口顶部TabBar)页面切换