JAVA中枚举如何保证线程安全

2023-05-16

枚举类型到底是什么类呢?是enum吗?明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是由什么类维护的呢,首先写一个简单的枚举
publicenumT {
    APPLE,BANANA,ORANGE;
}
  • 使用反编译查看源码:

publicfinalclass T extends Enum
{
    private T(String s, int i)
    {
        super(s, i);
    }
    publicstatic T[] values()
    {
        T at[];
        int i;
        T at1[];
        System.arraycopy(at = ENUM$VALUES, 0, at1 = newT[i = at.length], 0, i);
        return at1;
    }

    public static T valueOf(String s)
    {
        return (T)Enum.valueOf(demo/T, s);
    }

    publicstaticfinal T APPLE;
    publicstaticfinal T BANANA;
    publicstaticfinal T ORANGE;
    privatestaticfinal T ENUM$VALUES[];
    static
    {
        APPLE = newT("APPLE", 0);
        BANANA = newT("BANANA", 1);
        ORANGE = newT("ORANGE", 2);
        ENUM$VALUES = (newT[] {
            APPLE, BANANA, ORANGE
        });
    }
}
通过反编译后代码我们可以看到,public final class T extends Enum,说明,该类是继承了Enum类的,同时final关键字告诉我们,这个类也是不能被继承的。当我们使用enmu来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承,我们看到这个类中有几个属性和方法。
  • 其中

publicstaticfinal T APPLE;
    publicstaticfinal T BANANA;
    publicstaticfinal T ORANGE;
    privatestaticfinal T ENUM$VALUES[];
    static
    {
        APPLE = newT("APPLE", 0);
        BANANA = newT("BANANA", 1);
        ORANGE = newT("ORANGE", 2);
        ENUM$VALUES = (new T[] {
            APPLE, BANANA, ORANGE
        });
    }

都是static类型的,因为static类型的属性会在类被加载之后被初始化,当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以,创建一个enum类型是线程安全的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中枚举如何保证线程安全 的相关文章

  • 如果我在 XML 布局中声明一个片段,如何将它传递为 Bundle?

    我有一个活动已替换为片段 该活动采用了一个 Intent 其中包含一些有关该活动应该显示哪些数据的额外信息 现在 我的 Activity 只是执行相同工作的 Fragment 的包装器 如果我使用标记在 XML 中声明该片段 如何将该捆绑包
  • Java 中如何将 long 转换为 int?

    Java 中如何将 long 转换为 int 在 Java 8 中更新 Math toIntExact value 原答案 简单的类型转换应该可以做到 long l 100000 int i int l 但请注意 较大的数字 通常大于214
  • GSON:如何在保持循环引用的同时防止 StackOverflowError?

    我有一个带有循环引用的结构 出于调试目的 我想转储它 基本上任何格式都可以 但我选择了JSON 由于它可以是任何类 所以我选择了不需要 JAXB 注释的 GSON 但是 GSON 会遇到循环引用并递归直到StackOverflowError
  • 从 java servlet 运行长进程的最佳方法是什么?

    我想问从 java servlet 运行长进程的最佳方法是什么 我有一个网络应用程序 当客户端发出请求时 它会运行一个 servlet 该 servlet 应该从请求中获取一些参数 然后运行一个进程 这个过程可能需要很长时间 所以我需要单独
  • Java程序在没有定义main方法的情况下如何运行?

    我正在浏览一些 Java 源代码并注意到main方法未定义 Java如何编译源码却无从下手 The main方法仅在 Java 虚拟机执行代码时使用 没有 a 则无法执行代码main方法 但仍然可以编译 编译代码时 通常在命令行上指定一组文
  • GWT 和 Web 服务 (wsdl)

    谁能告诉我一种从 GWT 客户端访问 WSDL Web 服务的方法 这可能吗 Thanks 智能网关 http www smartclient com product index jsp支持 WSDL 数据源 除此之外 您始终可以将 WSD
  • Checkstyle 规则防止调用某些方法和构造函数

    是否可以使用 Checkstyle 来禁止使用某些使用系统相关默认值 区域设置 字符集等 的构造函数或方法 我更喜欢强制执行一项政策 程序员应该明确了解系统相关的值 所以我认为以下物品是危险的 all the constructors of
  • Android 是否可以获取用户和设备所在国家/地区的货币代码?

    是否可以获取用户和设备所在国家 地区的货币代码 我想将用户当前国家 地区的国家 地区代码设置为默认国家 地区 我们在 Android 中有解决方案吗 由于这段代码可能对您有帮助 public class CurrencyTest publi
  • 在 JSON 转换为 CSV 期间保持 JSON 键的顺序

    我正在使用此处提供的 JSON 库http www json org java index html http www json org java index html为了将 json 字符串转换为 CSV 但我遇到的问题是 转换后键的顺序
  • 在其抽象超类中使用子类的泛型类型?

    在我的代码中有以下抽象超类 public abstract class AbstractClass
  • 将十六进制字节数组解码为特定代码页在随后编码时会产生错误结果

    我创建了一个简单的应用程序 如下所示 String stringValue new String new byte 0x00 0x00 0x00 0x25 273 byte valueEncoded Arrays copyOfRange s
  • 在 Android 谷歌地图中绘制 4K 折线

    我现在正在开发一个适用于 Android 设备的应用程序 主要功能是在地图上绘制折线以显示城市中每条街道的交通情况 不幸的是 当我绘制大约 3K 折线时 数量会根据屏幕尺寸和缩放级别而减少 我的地图变得非常慢 我没有提及绘制所有线条的时间
  • 带有 Spock Stub 的泛型

    我无法为泛型类编译 Spock 存根 构造函数的签名如下 SomeClass SerSup
  • Java TreeMap时间复杂度-lowerKey

    时间复杂度是多少lowerKey Java实现中的操作TreeMap 我认为它是 log n 但我在文档中找不到它 更基本操作的复杂性已有详细记录 此实现提供了有保证的 log n 时间成本 containsKey 获取 放置和删除操作 顺
  • 如何从java程序中编译.java文件[重复]

    这个问题在这里已经有答案了 可能的重复 从 Java 内部编译外部 java 文件 https stackoverflow com questions 10889186 compiling external java files from
  • 将 XML 转换为 Java 对象 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JVM 是否会内联对象的实例变量和方法?

    假设我有一个非常紧密的内部循环 每次迭代都会访问和改变一个簿记对象 该对象存储有关算法的一些简单数据 并具有用于操作它的简单逻辑 簿记对象是私有的和最终的 并且它的所有方法都是私有的 最终的和 inline 下面是一个示例 Scala 语法
  • java中类的命名约定 - 全部大写

    在 Java 中 当类全部大写时 如何命名它 例如 如果我想创建一个班级来选择某些人成为 VIP 我应该将类命名为 VIPSelector 还是 VipSelector Thanks 你的两个选择都有效 类的主要目标是让它们以大写字母开头
  • struts2中如何访问url参数

    我正在做一个struts2项目 我在项目中创建了 url 并使用标签传递了参数 我的问题是如何读取操作中的参数 另外 如果执行相同的操作 我将能够将参数视为查询字符串 我问是因为我无法做到 而且我在其中一个教程中看到了它 通常 您将通过使用
  • 从 Web 服务器异步调用应用程序

    我有一个用 Spring 制作的 在 Tomcat 上运行的 Web 应用程序 在同一台机器上有一个普通的 Java 应用程序 我想通过从Web服务器调用Java应用程序来执行它 但我想让应用程序不会使用服务器的资源 它涉及分类器的训练 因

随机推荐

  • AudioService之音频输出通道切换

    前言 xff1a 音频输出的方式有很多种 xff0c 外放即扬声器 xff08 Speaker xff09 听筒 xff08 Telephone Receiver xff09 有线耳机 xff08 WiredHeadset xff09 蓝牙
  • UML 用例图以及UML的八种关系

    首先 xff0c 一张总体的知识脉络导图献上 xff1a 一 什么是用例图 xff1f 用例图描述了一组用例 参与者以及它们之间的关系 使用阶段 xff1a 软件需求分析 使用者 xff1a 软件分析人员 软件开发人员 用例模型 xff1a
  • 清除浏览器缓存后,发现页面样式不能加载了

    清除浏览器缓存后 xff0c 发现页面样式不能加载了 这里需要注意一个springboot版本问题 xff1a Spring Boot 1 x和2 x版本拦截器对于静态资源访问的区别 xff01 Spring Boot 1 x版本已经做好了
  • UML时序图(Sequence Diagram)

    什么是时序图 时序图 Sequence Diagram xff0c 又名序列图 循序图 xff0c 是一种UML交互图 它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作 让我们来看一看visio2016对时序图的的解释 时序图
  • UML流程图

    流程图介绍 流程图 xff08 FlowChart xff09 是描述我们进行某一项活动所遵循顺序的一种图示方法 它能通过图形符号形象的表示解决问题的步骤和程序 好的流程图 xff0c 不仅能对我们的程序设计起到作用 xff1b 在帮助理解
  • Android: 如何切换 SCO 链路

    最近在做蓝牙音箱开发 xff0c 在 A2DP 和 HFP 来回切换的时候 xff0c 遇到了手机兼容性的问题 最终发现设备收声和手机收声 xff0c 是因为 soc 切换有问题 原先在网上找了一些资料发现其实还蛮简单的 就两句话 xff0
  • Java 枚举(enum) 详解6种常见的用法

    用法一 xff1a 常量 在JDK1 5 之前 xff0c 我们定义常量都是 xff1a public static final 现在好了 xff0c 有了枚举 xff0c 可以把相关的常量分组到一个枚举类型里 xff0c 而且枚举提供了比
  • Android注解快速入门和实用解析

    首先什么是注解 xff1f 64 Override就是注解 xff0c 它的作用是 xff1a 1 检查是否正确的重写了父类中的方法 2 标明代码 xff0c 这是一个重写的方法 1 体现在于 xff1a 检查子类重写的方法名与参数类型是否
  • Android高版本Service在后台一分钟被杀死

    最近公司出现了一个Bug xff0c Service在后台写log时候一分钟左右被杀死 xff0c 或者运行一会就被杀死了 xff0c 上网搜了一下原来是Android高版本为了保护电量 xff0c 流量什么的 xff0c 会在后台杀死这些
  • 解决Android8.0之后开启service

    背景 项目测试时发现的 xff0c 在双击返回键关闭应用后 xff08 并未杀死后台 xff09 重新打开APP xff0c 其他手机都OK xff0c 但是8 0的手机会出现较频繁的crash 检查代码 xff0c 问题锁定在重新开启应用
  • 在Android Studio中使用Lambda

    应用场景 在使用过程中 xff0c 不建议在自定义接口中使用 xff0c 原因是因为Lambda常应用在只有一个方法的接口中 而我们自定义的接口 xff0c 后期可能会增加接口中的方法 xff0c 这样修改的地方就比较多 xff0c 因为L
  • Android枚举实现Parcelable接口

    枚举类实现Parcelable的写法如下 xff1a public enum MyEnum implements Parcelable FIRST 1 SECOND 2 private int mValue MyEnum int value
  • Android Studio Build Output控制台输出乱码解决

    Android Studio版本升级到4 0之后 xff0c 出现Build Output控制台输出乱码的现象 该情况在Android Studio版本3 6及以上就会出现 解决方法 xff1a 点击Android Studio 菜单栏He
  • 1230---KVM Windows 虚拟机磁盘如何快速扩容

    KVM Windows 虚拟机磁盘如何快速扩容 前言 xff1a 由于KVM虚拟机直接构建于宿主机内核之上 xff0c 对于充分利用宿主机硬件性能有天然的优势 网上针对KVM Linux 虚拟机运维的文章很多 xff0c 但针对KVM Wi
  • Android中的IPv6

    什么是IPv6 IPv6 的全称是Internet Protocol version 6 Internet Protocol 译为 互联网协议 xff0c 所以 IPv6 就是互联网协议第6版 它对比于 IPv4 所带来的是地址池的扩容 x
  • 浅谈Android下的注解

    什么是注解 java lang annotation xff0c 接口 Annotation xff0c 在JDK5 0及以后版本引入 注解是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运行时被读取 xff0c 并执行相应的处
  • 浅析Java中的final关键字

    一 final关键字的基本用法 在Java中 xff0c final关键字可以用来修饰类 方法和变量 xff08 包括成员变量和局部变量 xff09 下面就从这三个方面来了解一下final关键字的基本用法 1 修饰类 当用final修饰一个
  • volatile与Java内存模型

    1 volatile特点 volatile的两大特点是可见性和有序性 xff1b volatile的内存语义 xff1a 当写一个volatile变量时 xff0c JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中 当读一个v
  • 隐藏Detected problems with API compatibility警告弹窗

    如果在Android9 0亦即API 28或以上的系统中运行debug app时 xff0c 出现如下警告弹窗 xff1a Detected problems with API compatibility visit g co dev ap
  • JAVA中枚举如何保证线程安全

    枚举类型到底是什么类呢 xff1f 是enum吗 xff1f 明显不是 xff0c enum就和class一样 xff0c 只是一个关键字 xff0c 他并不是一个类 xff0c 那么枚举是由什么类维护的呢 xff0c 首先写一个简单的枚举