Синхронизация в Java полностью совместима - если второй поток не решит попытаться получить монитор (и если в методе, который пытается это сделать, ничего нет), он не будет автоматически блокироваться.
Дело не в том, что объект «заблокирован», а в том, что один поток владеет блокировкой, связанной с объектом.К самому объекту все еще можно получить доступ;если ему не нужна блокировка, он не будет блокироваться.
Обратите внимание, что вы можете получить ConcurrentModificationException
даже в пределах одного потока, если попытаетесь перебрать его и изменить в том же цикле,например,
// Not safe: will throw an exception
for (Map.Entry<String, String> entry : map.entrySet()) {
if (entry.getKey().equals("foo")) {
map.put("bar", "Hello");
}
}
Возможно, это то, что происходит в вашем коде, но мы не можем сказать, поскольку вы не показали нам какой-либо код.Если вы можете представить короткую, но полную программу, демонстрирующую проблему, у нас гораздо больше шансов разобраться в том, что происходит.