У меня есть Java HashMap с именем statusCountMap.
Вызов size () приводит к 30.
Но если посчитать записи вручную, получится 31
Это один из моих модульных тестов TestNG. Приведенные ниже результаты взяты из окна Display Eclipse (введите код -> выделите -> нажмите Display Result of Evaluating Selected Text).
statusCountMap.size() (int) 30 statusCountMap.keySet().size() (int) 30 statusCountMap.values().size() (int) 30 statusCountMap (java.util.HashMap) {40534-INACTIVE=2, 40526-INACTIVE=1, 40528-INACTIVE=1, 40492-INACTIVE=3, 40492-TOTAL=4, 40513-TOTAL=6, 40532-DRAFT=4, 40524-TOTAL=7, 40526-DRAFT=2, 40528-ACTIVE=1, 40524-DRAFT=2, 40515-ACTIVE=1, 40513-DRAFT=4, 40534-DRAFT=1, 40514-TOTAL=3, 40529-DRAFT=4, 40515-TOTAL=3, 40492-ACTIVE=1, 40528-TOTAL=4, 40514-DRAFT=2, 40526-TOTAL=3, 40524-INACTIVE=2, 40515-DRAFT=2, 40514-ACTIVE=1, 40534-TOTAL=3, 40513-ACTIVE=2, 40528-DRAFT=2, 40532-TOTAL=4, 40524-ACTIVE=3, 40529-ACTIVE=1, 40529-TOTAL=5} statusCountMap.entrySet().size() (int) 30
Что дает? Кто-нибудь сталкивался с этим?
Я почти уверен, что statusCountMap на данный момент не изменяется.
Есть 2 метода (назовем их methodA и methodB), которые изменяют statusCountMap одновременно , многократно вызывая incrementCountInMap.
private void incrementCountInMap(Map map, Long id, String qualifier) { String key = id + "-" + qualifier; if (map.get(key) == null) { map.put(key, 0); } synchronized (map) { map.put(key, map.get(key).intValue() + 1); } }
methodD - вот где я получаю проблему. methodD имеет TestNG @dependsOnMethods = {"methodA", "methodB"}, поэтому, когда methodD выполняется, statusCountMap уже почти статичен.
Я упоминаю об этом, потому что это может быть ошибка в TestNG.
Я использую Sun JDK 1.6.0_24. TestNG - это testng-5.9-jdk15.jar
Хммм ... после перечитывания моего поста, могло ли это быть из-за одновременного выполнения карты вне синхронизированного блока map.get (key) == null & map.put ( key, 0), вызывающего эту проблему?