美文网首页
java枚举是如何实现单例并保证线程安全的?

java枚举是如何实现单例并保证线程安全的?

作者: ModestStorm | 来源:发表于2020-06-12 18:39 被阅读0次
单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。

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

public enum T {
    SPRING,SUMMER,AUTUMN,WINTER;
}

//看看这段代码到底是怎么实现的,javap反编译class字节码:

//生成了T类继承自Enum类而且类型是final
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
        });
    }
}

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

相关文章

  • java枚举是如何实现单例并保证线程安全的?

    单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对...

  • java单例模式小结

    双检索实现的单例,是线程安全的。 枚举类型实现的单例,目前比较推荐

  • 单例

    单例,是Java中很重要的一个设计模式。 实现单例是要考虑并发(线程安全)问题的。 如何实现一个线程安全的单例?你...

  • 枚举来实现单例

    双重校验锁 实现单例: 枚举 实现单例: 上面的双重锁校验的代码很臃肿,是因为大部分代码都是在保证线程安全。为了在...

  • 实现单例模式的方式2

    方式一: 能保证线程安全 定义类的时候实现单例模式 方式二: 能保证线程安全 对已定义好的类实现单例模式

  • kotlin实现单例

    java实现单例模式 一直习惯于java的写法,java实现单例主要的思想是构造函数私有,然后考虑线程安全,在实现...

  • 设计模式——单例模式的破坏

    概述: 之前学习了单例模式的几种实现,解决了多线程情况下,单例的线程安全问题,保证了单例的实现。但是单例模式在下面...

  • 单例模式(Singleton)

    一、初始化单例类时即创建单例 饿汉式:(线程安全) 枚举类型:(线程安全) 二、按需、延迟创建单例 懒汉式:(线程...

  • Java笔试题

    一、Java 1、请实现一个单例类,提示:如何保证线程安全? 2、请写一个User的纯数据类,有id与name字段...

  • java单例的几种实现

    以上七种java的单例实现方式。第五种线程安全的单例实现,doublecheck,通过加上volatile,实现真...

网友评论

      本文标题:java枚举是如何实现单例并保证线程安全的?

      本文链接:https://www.haomeiwen.com/subject/nquntktx.html