EnumMap如何在未同步的情况下进行故障保护



我正在研究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);
}
  }

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

您可以在EnumMap.java源代码和注释中看到集合视图返回的迭代程序是弱一致的:它们将永远不会抛出ConcurrentModificationException,并且它们可能会也可能不会显示迭代进行时对映射进行的任何修改的效果。

EnumMap性能原因中给出的另一个方面

相关内容

  • 没有找到相关文章

最新更新