Проблема заключается в следующем.Я сделал набор
Set<User> users = Collections.synchronizedSet(new HashSet<User>())
...
for(User u : users){
//do something with u
}
Теперь, в соответствии с документацией Java.
Обязательно, чтобы пользователь вручную синхронизировал возвращенный отсортированный набор при итерации по нему или любому изего представления subSet, headSet или tailSet.
SortedSet s = Collections.synchronizedSortedSet(new HashSortedSet());
...
synchronized(s) {
Iterator i = s.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}
Я вполне уверен, что для каждого синтаксиса используются итераторы, но я не уверен, должен ли я обернуть каждый для каждого цикла синхронизированнымblock.
Еще одна вещь, моя IDE (IntelliJ IDEA) постоянно сообщает, что использование синхронизированного блока над полем, которое не является окончательным, вряд ли будет иметь полезную семантику, поскольку разные потоки могут быть разными объектами, даже при работе стот же объект.