LINUX.ORG.RU

[Java] ArrayList.writeObject()

 


0

0

Зачем в ArrayList elementData объявлено transient и тем не менее реализован метод writeObject(), который сериализует весь этот массив? Только для того, чтобы бросаться ConcurrentModificationException()?


Если этот метод унаследован от какого-нибудь интерфейса (проверь, самому лень), то удалить его нельзя. А раз еще нельзя и реализовать, то выбросить исключение - самое разумное.

anonymous
()

Класс ArrayList потоконебезопасен сам по себе. Поэтому выбрасывание исключения в методе сериализации состояния объекта этого класса — вполне ожидаемое явление. Hint: если нужно обеспечивать потоковую целостность объекта, используют обёртку:
List<String> readOnlyList = Collections.unmodifiableList(myArrayList);

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

> Класс ArrayList потоконебезопасен сам по себе.

Куча других классов тоже потоконебезопасны. Тем не менее, в этих случаях достаточно только одной строки в документации «Класс потоконебезопасен» и все понимают, что это значит.

Hint: если нужно обеспечивать потоковую целостность объекта, используют обёртку:

Не всегда применимо. Collections.synchronizedList().

anonymous
()

Всё, сам разобрался. Там сначала сериализируется размер исходного массива. А потом из реального массива сериализируются только реально используемые элементы.

anonymous
()
Ответ на: комментарий от anonymous

Куча других классов тоже потоконебезопасны. Тем не менее, в этих случаях достаточно только одной строки в документации «Класс потоконебезопасен» и все понимают, что это значит.

Это — к разработчикам C#. Это они любят обвешивать каждую мусепусечку тоннами ничего не раскрывающей документации (MSDN).

http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html

Note that this implementation is not synchronized.  If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more elements, or explicitly resizes the backing array; merely setting the value of an element is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the list. If no such object exists, the list should be "wrapped" using the Collections.synchronizedList  method. This is best done at creation time, to prevent accidental unsynchronized access to the list:

   List list = Collections.synchronizedList(new ArrayList(...));

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.

This class is a member of the Java Collections Framework.

Since:
    1.2

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Сам-то читал, что процитировал?

Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.

Повторяю: ConcurrentModificationException не гарантированы. Это просто плюшка для отладки быдлокода.

anonymous
()
Ответ на: комментарий от urxvt

> > Если этот метод унаследован от какого-нибудь интерфейса

Externalizable.


Протрите глаза.

bbk123 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.