У меня есть 1,8 класс Java, который содержит две коллекции:методы Синхронизировать для предотвращения ConcurrentModificationException
Map<Key,Object>
Set<Object>
Мой класс пять методов:
addObjectToMap()
removeObjectFromMap()
addObjectToSet()
removeObjectFromSet()
loopOverEverything(){
for(Object o : mySet){
for(Object o2 : myMap.getKeySet()){
doSomething(o,o2);
}
}
}
Точка класса реализовать шаблон наблюдателя, но быть очень гибкими как в наблюдателях, так и в наблюдениях. Проблема, с которой я сталкиваюсь, заключается в том, что последний метод может легко вызывать исключение ConcurrentModificationException, когда поток вызывает методы add/remove во время цикла. Я думал о синхронизации всех методов на «это»:
set.add(object);
станет
synchronized(this){
set.add(object);
}
, и я хотел бы добавить аналогичное заявление синхронизироваться с другими 4 способами, в том числе метод цикла.
Будет ли это работать? Я знаю, что методы синхронизации могут вызвать узкие места. Несмотря на то, что в настоящее время нет проблемы с производительностью, я хотел бы рационализировать этот дизайн и узнать о возможных альтернативах, которые имеют меньшую производительность.
@AndyTurner Это, вероятно, не решит проблему - 'Collections.synchronizedSet' не имеет блокировки во время итерации, поэтому вы все равно можете легко получить' ConcurrentModificationException'. – Sbodd