0

我正在研究 EnumMap,我想知道为什么它是故障安全的,尽管 EnumMap 的所有方法都没有同步。

我没有在键集上使用迭代器,而是在每个循环中使用

 public class JavaEnumMapExample {

  public enum MealType {
    BREAKFAST, LUNCH, SNACK, DINNER
}

public static void main(String[] args) {

    Map<MealType, String> myMealMap = new EnumMap<MealType, String>(MealType.class);

    // populate the map
    myMealMap.put(MealType.BREAKFAST, "Enjoy Milk and Eggs for breakfast!");
    myMealMap.put(MealType.LUNCH, "Enjoy Chicken, Rice and bread for Lunch!");
    myMealMap.put(MealType.SNACK, "How about an apple for the evening snack!");
    myMealMap.put(MealType.DINNER, "Keep the dinner light, lets have some salad!");

    System.out
            .println("Welcome to meal planner, we have suggestions for following meals : ");

    // print all the keys of enum map in sorted order
    System.out.println(myMealMap.keySet());

    // We can get the value from enumType
    System.out.println(" Q: What should I have for lunch? ");
    System.out.println(" A: " + myMealMap.get(MealType.LUNCH));

    System.out.println(" Q: What should I have for snack? ");
    System.out.println(" A: " + myMealMap.get(MealType.SNACK));

    System.out.println(" Q: What should I have for dinner? ");
    System.out.println(" A: " + myMealMap.get(MealType.DINNER));

    // Iterate over enumMap
    for (MealType mealType : myMealMap.keySet()) {
        System.out.println(myMealMap.get(mealType));
    }
    System.out.println("*** Checking for concurrent modification exception! ***");
    // Does not throw Concurrent modification Exception in enumMap
    for (MealType mealType : myMealMap.keySet()) {
        if (MealType.SNACK.equals(mealType)) {
            myMealMap.remove(MealType.SNACK);
        }
    }

    // map changed without throwing Concurrent modification Exception
    System.out.println(myMealMap);

}

  }

有人能告诉我为什么它是故障安全的吗?

4

1 回答 1

1

您可以看到 EnumMap.java 源代码,并且在评论中给出了集合视图返回的迭代器是弱一致的:它们永远不会抛出 ConcurrentModificationException并且它们可能会或可能不会显示在迭代过程中对映射进行的任何修改的影响.

EnumMap Performance Reason中给出的另一个方面

于 2015-02-27T06:18:38.033 回答