синхронизировать против Collection.synchronizedList против CopyOnWriteArrayList - PullRequest
0 голосов
/ 17 января 2011

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

  1. synchronize modifyListметод и использовать ArrayList.Все чтения из массива будут несинхронизированы или
  2. внутри modifyList, создайте Collections.synchronizedList (arrayList) или
  3. CopyOnWriteArrayList (не уверен, что он здесь покупает)

Зачем мне использовать либо?что лучше?

Ответы [ 2 ]

4 голосов
/ 17 января 2011

Для 1 и 2, я не уверен, что вы пытаетесь достичь, только синхронизируя записи. Если есть потенциальные читатели, которые могут выполнять итерации по списку, или которые ищут информацию по индексу, то только синхронизация записей ничего не доказывает. Читатели по-прежнему смогут читать, пока идет запись, и могут видеть грязные данные или получать исключения (ConcurrentModification или IndexOutOfBounds.)

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

CopyOnWriteArrayList специально создан для того, что вы хотите сделать. Он покупает безопасные итераторы без синхронизации, существенно увеличивая стоимость записи. У него также было преимущество делать то, что вы хотите (или то, что вам кажется нужным из краткого вопроса :)), полностью инкапсулированное в JavaSE API, что уменьшает «сюрприз» для будущих разработчиков.

(обратите внимание, что если у вас есть многошаговые процессы, включающие чтение с использованием 'get', даже с использованием CopyOnWriteArrayList может быть не совсем безопасно. Вам нужно оценить, что на самом деле делает ваш код, и если модификация с чередованием нарушит метод становится.)

2 голосов
/ 17 января 2011

Другим решением было бы использование ReentrantReadWriteLock, чтобы вы могли использовать блокировки только для чтения в операциях чтения (которые не блокируют другие операции чтения) и блокировку записи во время записи (которая будет блокировать до тех пор, пока не будет выполнено чтение, и не допустит никаких блокировок чтения до тех пор, пока она не будет освобождена.

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