Сериализация Java вызывает исключение модификации параллелизма - PullRequest
1 голос
/ 10 апреля 2011

Моя программа обновляет несколько сотен объектов, хранящихся в ArrayList, около ста раз в секунду.Я реализовал встроенную сериализацию в Java, и она работает хорошо, за исключением случаев, когда делается попытка сериализации, когда объекты идут на нее, и в этом случае мне, возможно, придется сериализоваться полдюжины раз, прежде чем она заработает (каждая неудачная попытка выдаетисключение).Я попытался пометить массив как временный, но затем, когда я загрузил файл сериализации, выдается исключение нулевого указателя.Поэтому я попытался инициализировать временный массив в конструкторе no args, что не помогло.Что я делаю?Спасибо.

Ответы [ 5 ]

3 голосов
/ 10 апреля 2011

Сначала убедитесь, что вы синхронизировали доступ к вашему ArrayList, например, когда вы его инициализируете:

List<String> list = Collections.synchronizedList(new ArrayList<String>());

Когда вам нужно сериализовать его, возьмите копию, которая будет согласованной из-за синхронизации:

List<String> copy = new ArrayList<String>(list);

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

0 голосов
/ 11 апреля 2011

Если вы действительно не хотите или не нуждаетесь в сериализованном содержимом списка, объявите вашего члена списка:

private transient final List<?> things = new ArrayList<Object>();

У вас всегда будет ненулевой список для работы.

ЭтоС другой стороны, возможно, вам придется подумать об обновлениях самого списка относительно других проблем безопасности потоков, таких как проблемы с передачей данных и проблемы с видимостью.

0 голосов
/ 10 апреля 2011

Используйте Итератор, если вы просматриваете коллекцию и одновременно модифицируете ее.

0 голосов
/ 10 апреля 2011

Скопируйте ArrayList в новый экземпляр (поверхностная копия с new ArrayList<>() и сериализуйте его.

0 голосов
/ 10 апреля 2011

Вы не можете выполнять итерации с оператором foreach и изменять таблицу.

Попробуйте использовать

for (int i =0;i<arra.length;i++) 

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...