ConcurrentModificationException генерируется, когда коллекция изменяется таким образом, что делает недействительными открытые итераторы. Обычно это происходит, когда к коллекции, которая не является поточно-ориентированной, обращаются из нескольких потоков (хотя это не единственная причина)
В вашем коде все еще есть небольшая ошибка - для безопасного доступа к члену, который сам по себе не является потокобезопасным, вы должны synchronize
в методе getAllPersons.
Предполагается, что это исправлено - поскольку вы возвращаете копию, сама коллекция не может быть изменена другими вызывающими (каждый получает свою собственную копию ). Это означает, что вы никогда не получите исключение ConcurrentModificationException.
Обратите внимание, что этот не защищает вас от проблем безопасности потоков с вашим классом Person
, а только сами коллекции. Если Person
является неизменным, вы должны быть в порядке.
В этом случае лучшим решением было бы непосредственное использование CopyOnWriteArrayList , который реализует аналогичную семантику, но копирует только тогда, когда вы действительно пишете в список - не каждый раз, когда вы читаете из него.