这是在静态方法中使单例映射线程安全的正确且有效的方法

Tas*_*ode 1 java map thread-safety

我想在初始化map时只创建一次锁.这是我正在使用的代码.

public static Map<String, String> getOrderStatusInstance() {
    if (orderStatusMap == null) {
        synchronized (Utility.class) {
            orderStatusMap = new HashMap<String, String>();

            orderStatusMap.put("Key1", "Value1");
            orderStatusMap.put("Key2", "Value2");
            orderStatusMap.put("Key3", "Value3");
            orderStatusMap.put("Key4", "Value4");
        }
    }

    return orderStatusMap;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

不,这是一个坏主意 - 你正在返回一个可变的,非线程安全的地图.您还尝试实现双重检查锁定,但没有正确执行 - 并且使用静态初始化比使用它更难.

我会创建一个不可变的映射(使用Guava,首选),理想情况下作为类初始化的一部分:

private static final ImmutableMap<String, String> STATUS_MAP = ImmutableMap.of(
    "Key1", "Value1",
    "Key2", "Value2",
    "Key3", "Value3",
    "Key4", "Value4");

public static ImmutableMap<String, String> getOrderStatusInstance() {
    return STATUS_MAP;
}
Run Code Online (Sandbox Code Playgroud)

(对于超过5个键/值对,请使用ImmutableMap.Builder.)

你真的需要它比那更懒惰吗?