枚举方式的线程安全的单例

Posted voctrals

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举方式的线程安全的单例相关的知识,希望对你有一定的参考价值。

1,枚举

public enum Color {
    blue, red, yellow
}

枚举是会被另外处理的。

  • 枚举只能拥有私有的构造器
  • 枚举类实际上是一个继承Enum的一个final类
  • 枚举类不允许被反序列化,Enum重写了方法
  • 静态代码块中对final变量的值进行初始化
  • enum类最终是一个final class
public final class voctrals.study.whatisspring.test.Color extends java.lang.Enum<voctrals.study.whatisspring.test.Color> {
  public static final voctrals.study.whatisspring.test.Color blue;
  public static final voctrals.study.whatisspring.test.Color red;
  public static final voctrals.study.whatisspring.test.Color yellow;
  public static voctrals.study.whatisspring.test.Color[] values(); // jdk给加上的
  public static voctrals.study.whatisspring.test.Color valueOf(java.lang.String); // jdk给加上的
  public int getValue();
  static {};
}

Enum中的方法

    /**
     * prevent default deserialization
     */
    private void readObject(ObjectInputStream in) throws IOException,
        ClassNotFoundException {
        throw new InvalidObjectException("can‘t deserialize enum");
    }

    private void readObjectNoData() throws ObjectStreamException {
        throw new InvalidObjectException("can‘t deserialize enum");
    }

 

2,单例模式

单例模式就是保证整个jvm中只存在唯一的一个实例。

饿汉式,在被jvm加载的过程中就已经被初始化了。静态代码块的原因。

public class BeanContainer {

    public static BeanContainer getInstance() {
        return ContainerHolder.HOLDER.instance;
    }

    private enum ContainerHolder {
        HOLDER;
        private BeanContainer instance;

        ContainerHolder() {
            instance = new BeanContainer();
        }
    }
}

 

以上是关于枚举方式的线程安全的单例的主要内容,如果未能解决你的问题,请参考以下文章

java里的单例实现

设计模式——单例模式

线程池 线程安全的单例模式 饿汉方式 懒汉方式

如何写一个简单的单例模式?

创建型模式之单例模式

线程安全的单例模式