枚举类型为什么是线程安全的?为什么反序列化枚举类型也不会创建新的实例?
枚举类型为什么是线程安全的?
我们定义的一个枚举,在第一次被真正用到的时候,会被虚拟机加载并初始化,而这个初始化过程是线程安全的。而我们知道,解决单例的并发问题,主要解决的就是初始化过程中的线程安全问题。
所以,由于枚举的以上特性,枚举实现的单例是天生线程安全的。
为什么反序列化枚举类型也不会创建新的实例?
枚举类型在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum
的valueOf
方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject
、readObject
、readObjectNoData
、writeReplace
和readResolve
等方法。
普通的Java类的反序列化过程中,会通过反射调用类的默认构造函数来初始化对象。所以,即使单例中构造函数是私有的,也会被反射给破坏掉。由于反序列化后的对象是重新new出来的,所以这就破坏了单例。(使用双重校验锁实现的单例其实是存在一定问题的,就是这种单例有可能被序列化锁破坏)
普通类的反序列化是通过反射实现的,枚举类的反序列化不是通过反射实现的。所以,枚举类也就不会发生由于反序列化导致的单例破坏问题。【源码基于jdk1.8】
参考:https://www.hollischuang.com/archives/2498
Serialization of Enum Constants
枚举类型为什么是线程安全的?为什么反序列化枚举类型也不会创建新的实例?相关推荐
- Java并发:五种线程安全类型、线程安全的实现、枚举类型
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u014454538/ article/details/98515807 1. Java中的线程安全 Java线程安全:狭义地认 ...
- java枚举类是怎么初始化的,为什么说枚举类是线程安全的
今天写枚举类的时候发现了一个有趣的现象,在这里分享一下: 首先我们定义一个简单的枚举类: /*** @author jinghuaixin* @date 2020/04/30*/ public enu ...
- java 枚举类型enum用法_别再说Python没有枚举类型了,好好看看
枚举 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们 ...
- 字符串类型、结构体、共用体、枚举、container宏、内存来源
一.C语言的字符串类型 1.C语言没有原生字符串类型 很多高级语言像java.C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = "linu ...
- java枚举类型有什么用_[转载] Java中枚举类型的使用 - enum
本文转载自博客 - Java枚举类型, 博主对原文内容及结构作了一定的修改. 1 枚举类的编译特性 从JDK 5开始, Java中多了一个关键字 -- enum: 可以将一组具有名称的值(包括Stri ...
- c语言枚举1到7输出星期几,c语言枚举类型
注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1#define ...
- 函数没有“as”子句;假定返回类型为 object。_TypeScript笔记(一)类型amp;接口...
数据类型 TS是强类型的JS,TS会被编译成JS在浏览器环境下运行,在遇到类型错误时,TS会在编译时类型检查并报错,在上传到服务器之前报错,这就意味着用户不会感知到TS的类型错误,而JS在执行时报错, ...
- executor线程池框架_如何使用Java 5 Executor框架创建线程池
executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...
- C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)
文章目录 目录 一. 数据类型 C++ 中的数据类型 typedef enumeration枚举类型 c++中变量类型 二.变量作用域 三.常量 四.修饰符类型 目录 一. 数据类型 C++ 中的数据 ...
最新文章
- nginx反向代理监听非80端口造成的端口丢失解决方案
- 机器学习应用方向(一)~英文姓名消歧(name disambiguation)
- 事件冒泡及阻止事件冒泡 事件的触发 事件参数对象 获取用户按下键盘的键
- kafka读写速度快的原因
- Angular里的RouterOutlet指令学习笔记
- golang 切片 接口_如何理解Golang中的接口?
- Java基础学习总结(54)——JSON和Map转换的工具类
- 全网段ip扫描工具_FuzzScanner 信息搜集的工具集
- c语言发牌小游戏,大家想想怎么用c实现我们经常玩的斗地主游戏的发牌过程呢?...
- centos6.4 安装wireless驱动
- 安装centos 6.5 在惠普 ...pro(有惠普增霸卡)上的诸些问题
- MPai数据科学平台
- 显示屏色温调节 影响 测试软件,教你把显示器调到最佳效果
- 实验11 静态路由配置
- 把字符串中的全角数字替换成半角数字 0123456789 转换成 0123456789
- 看脸的世界:牙齿整齐找工作更容易
- OFD文件转PDF怎么转换?教你一键转换方法
- 微村:做APP里的掌上村长
- 巴法络nas硬盘挂linux,教你轻松DIY——巴法络家用NAS使用详解
- iptables限制Docker IP和端口访问