Thread safe и ConcurrentModificationException - это разные понятия. Потокобезопасный объект - это объект, в котором несколько потоков могут одновременно вызывать свои методы, и гарантируется, что данные, содержащиеся в объекте, не будут повреждены (например: http://thejavacodemonkey.blogspot.com/2007/08/making-your-java-class-thread-safe.html). Возникает исключение ConcurrentModificationException, когда, например, вы во время итерации коллекции и изменения коллекции. Изменение может происходить из другого потока или из того же потока.
Если в вашем конструкторе другой поток изменяет someCollection
, пока ваш конструктор копирует его, это может привести либо к неопределенному поведению (то есть к повреждению данных в вашей новой коллекции, поскольку коллекции не являются поточно-ориентированными), либо к исключению ConcurrentModificationException (если коллекция обнаруживает одновременную модификацию, но это не гарантируется, поскольку она не является поточно-ориентированной ...: -)
Если ваш конструктор собирается получить Collection<Object>
, вам нужно убедиться, что другие потоки не изменяют коллекцию до тех пор, пока ваш конструктор не вернется.
С другой стороны, CopyOnWriteArrayList является потокобезопасным и гарантирует, что не будет выбрасывать ConcurrentModificationException, поэтому вы должны быть в безопасности, делая это таким образом, без написания дополнительного кода синхронизации.