Единственное, о чем я могу думать, это может быть вызвано тем, что состояние supportingLocation
как-то видоизменяется между вызовом get(...)
и containsKey(...)
.
Предполагая, что фрагмент кода, который вы разместили, является точным кодом, вызывающим проблемы, единственное место, где это может произойти, это если один из Location#getZ(...)
, Location#hashCode()
или Location#equals(Object)
изменяет состояние Location (или конструктор Location, или один из этих методов запускает поток, который случайным образом изменяет состояние экземпляра Location, но я думаю, что мы можем исключить это).
Не могли бы вы убедиться, что ни один из перечисленных методов не меняет состояние экземпляра supportingLocation
? Хотя я не знаком с самим классом Location
, рискну предположить, что такой класс в идеале был бы неизменным.
Edit:
Чтобы уточнить, когда я говорю, что Location#getZ()
и т.д. не изменяют местоположение, я имею в виду:
Location x = new Location(1,2,3);
Location y = new Location(1,2,3);
boolean eq1 = x.equals(y);
int hash1 = x.hashCode();
x.getZ(); // this should *not* mutate the state of x
boolean eq2 = x.equals(y);
int hash2 = x.hashCode();
В конце концов, eq1 должно быть равно eq1, а hash1 должно быть равно hash2. Если это не так, getZ () изменяет состояние x (или равно, или hashCode, или, что еще хуже, эти методы полностью отключены), и приведет к поведению, которое вы наблюдали.