Member
Статус: Не в сети Регистрация: 08.08.2008 Фото: 3
Вопрос касается таких вещей, как CopyOnWriteArrayList и CopyOnWriteArraySet. Допустим, я хочу создать CopyOnWriteArrayList, который содержит CopyOnWriteArraySet`ы, которые уже содержат какие-то Object`ы. Есть объект Storage с методом public boolean setObject(n, o), где n - номер Set`a, o - номер объекта. В нём заданный объект добавляется (add) в выбранный Set. Теперь представим ситуацию, когда много потоков решают одновременно вызвать setObject и положить заведомо разные объекты (hash и equals адекватные, коллизии исключаем) в коллекции. Вопрос: почему в таком случае объекты иногда просто теряются в процессе добавления? Тесты показали, что в случае с synchronized SetObject объекты не теряются, но ведь вся фишка этих коллекций, что они должны работать в многопотоке сами по себе. Расскажите, в каком месте теряются мои Object`ы? P.S. Пожалуйста, не превращайте тему в обсуждение реализации.
_________________ Была картошка простая - стала золотая, были грибки простые - стали золотые, была рыбка простая - стала золотая. Еле процессоры спасли!
CopyOnWriteArrayList (и, следовательно, CopyOnWriteArraySet) предполагает, что в определенный момент времени могут хранится две копии данных: та копия, что предназначена для работы модифицирующей операции (типа add) и та копия, с которой работают итераторы. Если вы умудрились изменить вторую копию, воспользовавшись ссылкой, что выдает итератор, то такие изменения пропадут. Поскольку вторая копия существует лишь до тех пор, пока не завершится модифицирующая операция.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения