java枚举是怎么保证线程安全的

技术java枚举是怎么保证线程安全的本篇内容介绍了“java枚举是怎么保证线程安全的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

本文介绍了关于“java枚举如何确保线程安全”的知识。很多人在实际案件操作中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!

枚举是如何保证线程安全的

要想看到源代码,首先要有一个类,那么枚举类型是什么呢?是枚举吗?答案显然不是。enum只是一个关键字,就像class一样。它不是一个类。那么枚举由哪个类维护呢?让我们简单地写一个枚举:

公共枚举t {SPRING,SUMMER,FAULT,WINTER}

然后我们使用反编译来看看这段代码是如何实现的。反编译(Java的反编译)后,代码内容如下:

公共最终类T扩展了Enum {私有T(String s,int i){super(s,I)};}公共静态T[]值(){ T at[];int I;t at 1[];system . array copy(at=ENUM $ VALUES,0,at1=new T[i=at.length],0,I);在1点返回;}公共静态T值Of(字符串){return (T)Enum.valueOf(演示/T,s);}公共静态最终T SPRING公开静态决赛T SUMMER大众静态决赛T fault;公共静态决赛T WINTER私有静态最终T ENUM $ VALUES[];静态{SPRING=新T('SPRING ',0);SUMMER=新T('SUMMER ',1);秋=新T('秋',2);WINTER=新T('WINTER ',3);ENUM$VALUES=(new T[] {SPRING,SUMMER,秋,冬});}}

从反编译的代码中我们可以看到,公共最终类T扩展Enum表明这个类继承了Enum类,而final关键字告诉我们这个类也不能继承。当我们使用穆恩定义枚举类型时,编译器会自动帮助我们创建一个继承枚举类的最终类型类,因此枚举类型不能被继承。我们看到这个类中有几个属性和方法。

我们可以看到:

公共静态最终T SPRING公开静态决赛T SUMMER大众静态决赛T fault;公共静态决赛T WINTER私有静态最终T ENUM $ VALUES[];静态{SPRING=新T('SPRING ',0);SUMMER=新T('SUMMER ',1);秋=新T('秋',2);WINTER=新T('WINTER ',3);ENUM$VALUES=(new T[] {SPRING,SUMMER,秋,冬});}

它们都是静态类型的,因为静态类型的属性将在类加载后初始化。我们在两篇文章中分别介绍了对Java的类加载器机制(源代码级)和Java类加载、链接和初始化的深入分析。当一个Java类第一次实际使用时,静态资源被初始化,Java类的加载和初始化过程是线程安全的。因此,创建枚举类型是线程安全的。

为什么用枚举实现的单例是最好的方式

在[注] singleton pattern的七种编写方法中,我们可以看到实现singleton的方法有七种。其中,Effective Java作者Josh Bloch提倡使用枚举。既然大神说这种方式好,我们就要知道为什么好。

1. 枚举写法简单

简单的写作。让我们来看看singleton pattern的七种编写方法的实现,以了解它们之间的区别。

公共枚举EasySingleton { INSTANCE}

您可以通过EasySingleton访问它。情况

2. 枚举自己处理序列化

我们知道,以前所有的singleton模式都有一个很大的问题,那就是一旦实现了Serializable接口,它就不再是singleton了,因为对readObject()方法的每次调用都会返回一个新创建的对象,一种解决方案是使用readResolve()方法来避免这种情况。

但是,**为了保证Java规范中所述的枚举类型在JVM中是唯一的,Java对枚举类型的序列化和反序列化做了特殊的规定。

序列化时,Java只将枚举对象的name属性输出到结果中,而反序列化时,则使用java.lang.Enum的valueOf方法按名称查找枚举对象。

同时,编译器不允许对这种序列化机制进行任何自定义,因此禁用了writeObject、readObject、readObjectNoData、writeReplace readResolve等方法。让我们看看这个方法的价值:

公共静态T扩展了EnumT T valueOf(ClassT enumType,String name) { T结果=enum type . enumconstanntdirectory()。get(name);如果(结果!=null)返回结果;if (name==null)抛出新的NullPointerException('Name为null ');引发新的IllegalArgumentException('无枚举常量'枚举类型' '姓名);}

从代码中可以看到,代码将尝试通过调用Class对象enumType的enumConstantDirectory()方法从返回的映射中获取名为name的枚举对象,如果它不存在,将引发异常。

进一步遵循enumconstatdirectory()方法,你会发现最后会以反射的方式调用enumType静态值()方法,也就是我们上面看到的编译器为我们创建的方法,然后enumconstatdirectory对象中的enumconntdirectory属性会被返回的结果填充。

因此,JVM保证了序列化。

3.枚举实例创建是thread-safe(线程安全的)

当第一次实际使用Java类时,静态资源被初始化,加载和初始化Java类的过程是线程安全的。因此,创建枚举类型是线程安全的。

这里介绍一下“java枚举如何保证线程安全”的内容。感谢您的阅读。如果你想了解更多的行业,可以关注网站。边肖将为您输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/105117.html

(0)

相关推荐

  • 河南十三届ICPC部分题解

    技术河南十三届ICPC部分题解 河南十三届ICPC部分题解A.祝融传火
    输入之后,暴力枚举\((x,y)\)判断即可
    #include bits/stdc++.h
    using namespace std

    礼包 2021年10月20日
  • Oracle 12c新特性有哪些

    技术Oracle 12c新特性有哪些本篇内容介绍了“Oracle 12c新特性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

    攻略 2021年11月15日
  • react中的flux是什么

    技术react中的flux是什么本篇内容主要讲解“react中的flux是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“react中的flux是什么”吧!

    攻略 2021年11月24日
  • 简述漏洞利用类samba的实验步骤(samba漏洞利用实验步骤)

    技术如何分析Samba信息泄露漏洞SambaBleed本篇文章给大家分享的是有关如何分析Samba信息泄露漏洞SambaBleed,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟

    攻略 2021年12月21日
  • 额宝,支付宝于额宝。是什么意思

    技术额宝,支付宝于额宝。是什么意思支付宝里的余额是支付宝平台的一个资金账户额宝,可以随存随取,也可以用于支付宝上面消费,但转入余额账户的资金不产生收益。余额宝是一种资金管理服务。转入余额宝,即购买货币基金,可享货币基金收

    生活 2021年10月20日
  • excel标准差函数,excel怎么算标准差和方差

    技术excel标准差函数,excel怎么算标准差和方差在excel表格中,VARPA函数可以用于计算方差,STDEVPA函数可以用于计算标准差excel标准差函数。 参考工具和原料: 1.一台Windows7系统笔记本电

    2021年10月22日