Enum.valueOf() 线程安全?

暗火世界 发布于 2016/08/24 09:50
阅读 229
收藏 0
JDK

Enum.valueOf() 线程安全?

在Java中,我们经常使用的Enum.valuesOf()是否是线程安全的?

 public static <T extends Enum<T>> T valueOf(Class<T> 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 constant " + enumType.getCanonicalName() + "." + name);
    }


enumConstantDirectory方法为:

Map<String, T> enumConstantDirectory() {
        if (enumConstantDirectory == null) {
            T[] universe = getEnumConstantsShared();
            if (universe == null)
                throw new IllegalArgumentException(
                    getName() + " is not an enum type");
            Map<String, T> m = new HashMap<>(2 * universe.length);
            for (T constant : universe)
                m.put(((Enum<?>)constant).name(), constant);
            enumConstantDirectory = m;
        }
        return enumConstantDirectory;
    }

当对

 
private volatile transient Map<String, T> enumConstantDirectory = null;

当对Enum#enumConstantDirectory 进行写入时候,没有加锁。 

那么Enum的valueOf方法,是否是线程安全的。在多个线程并发操作的时候,怎么保证仅仅初始化一次enumConstantDirectory属性。

虽然JDK这么写也没有错,最多就是多生成几次 enumConstantDirectory 这个Map。


加载中
返回顶部
顶部