枚举类型为什么是线程安全的?

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

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

为什么反序列化枚举类型也不会创建新的实例?

枚举类型在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.EnumvalueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObjectreadObjectreadObjectNoDatawriteReplacereadResolve等方法。

普通的Java类的反序列化过程中,会通过反射调用类的默认构造函数来初始化对象。所以,即使单例中构造函数是私有的,也会被反射给破坏掉。由于反序列化后的对象是重新new出来的,所以这就破坏了单例。(使用双重校验锁实现的单例其实是存在一定问题的,就是这种单例有可能被序列化锁破坏)

普通类的反序列化是通过反射实现的,枚举类的反序列化不是通过反射实现的。所以,枚举类也就不会发生由于反序列化导致的单例破坏问题。【源码基于jdk1.8】

参考:https://www.hollischuang.com/archives/2498

Serialization of Enum Constants

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

  1. Java并发:五种线程安全类型、线程安全的实现、枚举类型

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u014454538/ article/details/98515807 1. Java中的线程安全 Java线程安全:狭义地认 ...

  2. java枚举类是怎么初始化的,为什么说枚举类是线程安全的

    今天写枚举类的时候发现了一个有趣的现象,在这里分享一下: 首先我们定义一个简单的枚举类: /*** @author jinghuaixin* @date 2020/04/30*/ public enu ...

  3. java 枚举类型enum用法_别再说Python没有枚举类型了,好好看看

    枚举 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们 ...

  4. 字符串类型、结构体、共用体、枚举、container宏、内存来源

    一.C语言的字符串类型 1.C语言没有原生字符串类型 很多高级语言像java.C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = "linu ...

  5. java枚举类型有什么用_[转载] Java中枚举类型的使用 - enum

    本文转载自博客 - Java枚举类型, 博主对原文内容及结构作了一定的修改. 1 枚举类的编译特性 从JDK 5开始, Java中多了一个关键字 -- enum: 可以将一组具有名称的值(包括Stri ...

  6. c语言枚举1到7输出星期几,c语言枚举类型

    注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1#define ...

  7. 函数没有“as”子句;假定返回类型为 object。_TypeScript笔记(一)类型amp;接口...

    数据类型 TS是强类型的JS,TS会被编译成JS在浏览器环境下运行,在遇到类型错误时,TS会在编译时类型检查并报错,在上传到服务器之前报错,这就意味着用户不会感知到TS的类型错误,而JS在执行时报错, ...

  8. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

  9. C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)

    文章目录 目录 一. 数据类型 C++ 中的数据类型 typedef enumeration枚举类型 c++中变量类型 二.变量作用域 三.常量 四.修饰符类型 目录 一. 数据类型 C++ 中的数据 ...

最新文章

  1. nginx反向代理监听非80端口造成的端口丢失解决方案
  2. 机器学习应用方向(一)~英文姓名消歧(name disambiguation)
  3. 事件冒泡及阻止事件冒泡 事件的触发 事件参数对象 获取用户按下键盘的键
  4. kafka读写速度快的原因
  5. Angular里的RouterOutlet指令学习笔记
  6. golang 切片 接口_如何理解Golang中的接口?
  7. Java基础学习总结(54)——JSON和Map转换的工具类
  8. 全网段ip扫描工具_FuzzScanner 信息搜集的工具集
  9. c语言发牌小游戏,大家想想怎么用c实现我们经常玩的斗地主游戏的发牌过程呢?...
  10. centos6.4 安装wireless驱动
  11. 安装centos 6.5 在惠普 ...pro(有惠普增霸卡)上的诸些问题
  12. MPai数据科学平台
  13. 显示屏色温调节 影响 测试软件,教你把显示器调到最佳效果
  14. 实验11 静态路由配置
  15. 把字符串中的全角数字替换成半角数字 0123456789 转换成 0123456789
  16. 看脸的世界:牙齿整齐找工作更容易
  17. OFD文件转PDF怎么转换?教你一键转换方法
  18. 微村:做APP里的掌上村长
  19. 巴法络nas硬盘挂linux,教你轻松DIY——巴法络家用NAS使用详解
  20. iptables限制Docker IP和端口访问

热门文章

  1. 你得知道这3个最基础的APP技术框架
  2. Log4j2的additivity属性(是否去除冗余日志)
  3. 工厂生产线智能远程监控方案
  4. sql语句字符串包含
  5. 华为交换机CE6800系列基于接口划分vlan配置
  6. 你的伙伴对你最大会话_有人说 在微信聊天里 你怎么结束一段对话 就能看出你和对方的...
  7. 第1章 电子商务概述
  8. 受玻璃废品再利用启发 法国塑料瓶回收或采用新奖励机制
  9. OpenGL-MSAA
  10. Android二维码原理与优化方向