Для 1 и 2, я не уверен, что вы пытаетесь достичь, только синхронизируя записи. Если есть потенциальные читатели, которые могут выполнять итерации по списку, или которые ищут информацию по индексу, то только синхронизация записей ничего не доказывает. Читатели по-прежнему смогут читать, пока идет запись, и могут видеть грязные данные или получать исключения (ConcurrentModification
или IndexOutOfBounds
.)
Вам нужно будет синхронизировать чтение и запись, если вы хотите, чтобы «безопасные» итерации выполнялись, а другие потоки вносили изменения. В этот момент вы могли бы просто использовать Vector
.
CopyOnWriteArrayList
специально создан для того, что вы хотите сделать. Он покупает безопасные итераторы без синхронизации, существенно увеличивая стоимость записи. У него также было преимущество делать то, что вы хотите (или то, что вам кажется нужным из краткого вопроса :)), полностью инкапсулированное в JavaSE API, что уменьшает «сюрприз» для будущих разработчиков.
(обратите внимание, что если у вас есть многошаговые процессы, включающие чтение с использованием 'get', даже с использованием CopyOnWriteArrayList
может быть не совсем безопасно. Вам нужно оценить, что на самом деле делает ваш код, и если модификация с чередованием нарушит метод становится.)