Я рассматриваю этот кусок кода. Этот конструктор делегирует нативный метод «System.arraycopy»Java - безопасность потоков конструкторов ArrayList
Реальная безопасность? И я имею в виду, может ли это когда-нибудь бросить ConcurrentModificationException?
public Collection<Object> getConnections(Collection<Object> someCollection) {
return new ArrayList<Object>(someCollection);
}
ли какая-нибудь разница, если коллекция копируется в THREADSAFE например CopyOnWriteArrayList?
public Collection<Object> getConnections(CopyOnWriteArrayList<Object> someCollection) {
return new ArrayList<Object>(someCollection);
}
Edit: Я знаю, что THREADSAFE = ConcurrentModificationException!. Я пытаюсь сделать снимок данных в определенный момент времени. Поэтому, если другой Thread пишет someCollection на полпути через копию, мне не важно, имеет ли результат новый объект или нет. Я просто не хочу, чтобы бросить ConcurrentModificationException или хуже
Это не теоретическая проблема: непредсказуемое поведение * будет * происходить. Единственная точка неопределенности - это то, как часто это произойдет. –
@ Stephen: вы правы, но перепрограммировать ошибки, не связанные с порядком, чрезвычайно сложно. Я нашел только один пример в следующей статье: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html –
Трудно воспроизвести! = Теоретический. Кроме того, несколько примеров, описанных на веб-страницах! = Теоретические. :-) –