当前位置: 首页 > news >正文

网站ftp需要关闭珠海建设银行官方网站

网站ftp需要关闭,珠海建设银行官方网站,福州交通建设投资集团网站,最新的购物网站 开转载自 Java中枚举的线程安全性及序列化问题 Java SE5提供了一种新的类型-Java的枚举类型#xff0c;关键字enum可以将一组具名的值的有限集合创建为一种新的类型#xff0c;而这些具名的值可以作为常规的程序组件使用#xff0c;这是一种非常有用的功能。本文将深入分析枚…转载自  Java中枚举的线程安全性及序列化问题 Java SE5提供了一种新的类型-Java的枚举类型关键字enum可以将一组具名的值的有限集合创建为一种新的类型而这些具名的值可以作为常规的程序组件使用这是一种非常有用的功能。本文将深入分析枚举的源码看一看枚举是怎么实现的他是如何保证线程安全的以及为什么用枚举实现的单例是最好的方式。 枚举是如何保证线程安全的 要想看源码首先得有一个类吧那么枚举类型到底是什么类呢是enum吗答案很明显不是enum就和class一样只是一个关键字他并不是一个类那么枚举是由什么类维护的呢我们简单的写一个枚举 public enum t {SPRING,SUMMER,AUTUMN,WINTER; }然后我们使用反编译看看这段代码到底是怎么实现的反编译Java的反编译后代码内容如下 public final class T extends Enum {private T(String s, int i){super(s, i);}public static T[] values(){T at[];int i;T at1[];System.arraycopy(at  ENUM$VALUES, 0, at1  new T[i  at.length], 0, i);return at1;}public static T valueOf(String s){return (T)Enum.valueOf(demo/T, s);}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[];static{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});} }通过反编译后代码我们可以看到public final class T extends Enum说明该类是继承了Enum类的同时final关键字告诉我们这个类也是不能被继承的。当我们使用enmu来定义一个枚举类型的时候编译器会自动帮我们创建一个final类型的类继承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[];static{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});}都是static类型的因为static类型的属性会在类被加载之后被初始化我们在深度分析Java的ClassLoader机制源码级别和Java类的加载、链接和初始化两个文章中分别介绍过当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以创建一个enum类型是线程安全的。 为什么用枚举实现的单例是最好的方式 在单例模式的七种写法中我们看到一共有七种实现单例的方式其中Effective Java作者Josh Bloch 提倡使用枚举的方式既然大神说这种方式好那我们就要知道它为什么好 关于这个问题我有一篇为什么我墙裂建议大家使用枚举来实现单例。单独介绍过这里再回顾一下。 1. 枚举写法简单 写法简单这个大家看看单例模式的七种写法里面的实现就知道区别了。 public enum EasySingleton{INSTANCE; }你可以通过EasySingleton.INSTANCE来访问。 2. 枚举自己处理序列化 我们知道以前的所有的单例模式都有一个比较大的问题就是一旦实现了Serializable接口之后就不再是单例得了因为每次调用 readObject()方法返回的都是一个新创建出来的对象有一种解决办法就是使用readResolve()方法来避免此事发生。但是为了保证枚举类型像Java规范中所说的那样每一个枚举类型极其定义的枚举变量在JVM中都是唯一的在枚举类型的序列化和反序列化上Java做了特殊的规定。英文原文我就不贴了。 大概意思就是说在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时编译器是不允许任何对这种序列化机制的定制的因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。 我们看一下这个valueOf方法 public static T extends EnumT T valueOf(ClassT enumType,String name) {  T result  enumType.enumConstantDirectory().get(name);  if (result ! null)  return result;  if (name  null)  throw new NullPointerException(Name is null);  throw new IllegalArgumentException(  No enum const   enumType .  name);  }  从代码中可以看到代码会尝试从调用enumType这个Class对象的enumConstantDirectory()方法返回的map中获取名字为name的枚举对象如果不存在就会抛出异常。再进一步跟到enumConstantDirectory()方法就会发现到最后会以反射的方式调用enumType这个类型的values()静态方法也就是上面我们看到的编译器为我们创建的那个方法然后用返回结果填充enumType这个Class对象中的enumConstantDirectory属性。 所以JVM对序列化有保证。 3.枚举实例创建是thread-safe(线程安全的) 我们在深度分析Java的ClassLoader机制源码级别和Java类的加载、链接和初始化两个文章中分别介绍过当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以创建一个enum类型是线程安全的。
http://www.zqtcl.cn/news/852915/

相关文章:

  • 镇江市住房和城乡建设局网站常州建设网站
  • 学做美食的网站男女做暖暖到网站
  • 手机的网站建设目标刚做的网站 搜不到
  • 重庆网站建设哪里比较好呢ps怎么做网站logo
  • 网站建设五项基本原则优化关键词的公司
  • 高端网站的特点p2p网站开发的流程
  • 什么网站做外贸最好坪地网站建设公司
  • 做网站费用怎么核算没有公司 接单做网站
  • 如何建设一个优秀的电商网站wordpress注册去掉电子邮件
  • 站长工具 seo综合查询长沙高校网站制作公司
  • 杭州网站定制开发哪家好wordpress重置
  • 哈尔滨市建设安全网站火车头更新wordpress
  • 做亚马逊外国网站需要语言好吗邢台seo
  • jsp在网站开发中的优势国内哪个推广网站做的好
  • 做网站工资高吗精品资料
  • 做农业需关注什么网站热门代理项目
  • 网站开发公司营业范围照片制作视频软件app
  • 做网站怎么qq邮箱验证免费拥有wordpress
  • 校园网站建设资金来源有wordpress权重
  • 魔站网站开发wordpress 3.3.1
  • 东莞个人免费建网站网站后台管理系统 asp
  • 呼和浩特网站制作 建设wordpress怎么改中文
  • 银医网站建设方案公司网站模板免费下载
  • 优秀网站设计案例中国网站建设东莞公司
  • 自己的公网ip可以做网站网页设计与制作课程思政建设内容
  • 静态网站 搜索搭建织梦网站教程
  • idc 网站备案手机电脑网站建设短视频
  • 做搜狗pc网站优化快速亚马逊云搭建WordPress
  • 免费的建网站软件2020做seo还有出路吗
  • 宁波三优互动网站建设公司怎么样网站建设公司管理流程图