EnumSet 是线程安全的吗?我的测试表明它是安全的

Is EnumSet Thread-safe? My test show me it is safe

这些是我的测试代码,输出告诉我它是线程安全的。我错了吗?

我认为所谓的线程安全就是run(){}方法是原子的

    import java.util.EnumMap;
    import java.util.HashMap;
    import java.util.Map;

    import com.enumTest.enumStateMac.Input;

public class TestEnumMapSafe implements Runnable {

    private String name = "";

    public TestEnumMapSafe(String name) {
        this.name = name;
    }

    static Map<Input, Input> enumHashMap = new EnumMap<Input, Input>(Input.class);

    public static void main(String[] args) throws InterruptedException {

        TestEnumMapSafe testEnumMapSafe1 = new TestEnumMapSafe("Thread_1");
        TestEnumMapSafe testEnumMapSafe2 = new TestEnumMapSafe("Thread_2");
        TestEnumMapSafe testEnumMapSafe3 = new TestEnumMapSafe("Thread_3");

            testEnumMapSafe1.run();
            testEnumMapSafe2.run();
            testEnumMapSafe3.run();

    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            enumHashMap.put(Input.ABORT_TRANSACTION, Input.ABORT_TRANSACTION);
            enumHashMap.put(Input.CHIPS, Input.CHIPS);
            enumHashMap.put(Input.QUARTER, Input.QUARTER);
            System.out.println("this.name: " + this.name + "  enumHashMap.keySet() : " + enumHashMap.keySet());
            enumHashMap.clear();
        }

    }
}
/*this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_1  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_2  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
this.name: Thread_3  enumHashMap.keySet() : [QUARTER, CHIPS, ABORT_TRANSACTION]
*/

有人可以帮忙吗?我对 "thread-safe" 的测试有问题吗?

来自 EnumSet javadoc:

* Like most collection implementations, <tt>EnumSet</tt> is not * synchronized. If multiple threads access an enum set concurrently, and at * least one of the threads modifies the set, it should be synchronized * externally.

EnumSet 是 'safe' 仅在同时使用时不会抛出任何异常的意义上。但是,它必须同步,否则您可能会看到过时版本的数据。

至于测试线程安全。正如其他人提到的,您无法通过 运行 一些测试来证明您的程序已正确同步。由于缺乏同步,您可能会观察到一些错误行为,但不能保证您一定会这样做。

要真正让您的测试执行多线程操作,请尝试以下操作:

public static void main(String[] args) throws InterruptedException {

    TestEnumMapSafe testEnumMapSafe1 = new TestEnumMapSafe("Thread_1");
    TestEnumMapSafe testEnumMapSafe2 = new TestEnumMapSafe("Thread_2");
    TestEnumMapSafe testEnumMapSafe3 = new TestEnumMapSafe("Thread_3");

    final ExecutorService executor = Executors.newCachedThreadPool();

    executor.submit(testEnumMapSafe1);
    executor.submit(testEnumMapSafe2);
    executor.submit(testEnumMapSafe3);

    executor.shutdown();

    //wait some arbitrary period to allow test to complete
    executor.awaitTermination(10, TimeUnit.MINUTES);
}

但是,正如其他人所说,这可能是徒劳的。您可能会看到问题,也可能不会。