Ты захватываешь блокировку только на время чтения. Это значит, что HashMap между двумя такими чтениями может измениться. А, следовательно, результат может быть некорректным.