2013-05-10 3 views
0

В многопоточной среде у меня есть Singleton со статическим ArrayList.Обновления Singleton в многопоточной среде

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

Что произойдет с петлей (первая нить)? В идеале я бы хотел, чтобы цикл «for» заполнялся «старыми» данными, и если я снова получу экземпляр, то для получения нового набора данных.

Это трюк в этом случае, чтобы не использовать летучие? Или создать новый ArrayList из статического массива ArrayList для цикла for? Или... ?

+1

Есть много ресурсов здесь, на StackOverflow обсуждения этого: http://stackoverflow.com/questions/2715983/concurrent-threads-adding-to-arraylist-at-same- например, время. – jontro

+0

ArrayList не является потокобезопасным. Вам необходимо синхронизировать каждый доступ к списку с предсказуемым поведением или использовать параллельный список (из пакета java.util.concurrent). Я бы сказал, что если вам нужно это спросить, вы не должны заниматься проблемами многопоточности. Многопоточность действительно сложна. Читайте * Java-параллелизм в Практике * Брайана Гетца. –

ответ

-3

Это лучше использовать вектор в многопоточной среде вместо ArrayList. Обсуждение между вектором и ArrayList: http://www.javaworld.com/javaqa/2001-06/03-qa-0622-vector.html

+1

Использование Vector не сделает работу итерации прекрасной, это еще один поток, добавляет что-то к ней, пока iterationg. Вы получите предсказуемое исключение ConcurrentModificationException, вот и все. И Vector действительно больше не следует использовать. Если вам нужен синхронизированный список (который в большинстве случаев не достаточен), используйте Collections.synchronizedList(). –

Смежные вопросы