Webapp: безопасное обновление общего списка / карты в AppContext - PullRequest
2 голосов
/ 18 июня 2010

У меня есть списки и карты в моем WebAppContext.
В большинстве случаев они читаются только несколькими потоками, но иногда необходимо обновить или добавить некоторые данные.
Мне интересно, каков наилучший способ сделать это без использования ConcurrentModificationException.

Я думаю, что с помощью CopyOnWriteArrayList я могу добиться того, что хочу, с точки зрения
- мне не нужно синхронизироваться при каждой операции чтения
- я могу безопасно обновить список, пока другие потоки читаем это.

Это лучшее решение? А как насчет карт?

Ответы [ 2 ]

2 голосов
/ 18 июня 2010

Вы хотите быть осторожным при использовании CopyOnWriteArrayList. Типичная коллекция (в очень широком масштабе) - это 80%, читает 19%, пишет и 1% удаляет. CopyOnWriteArraylist работает плохо в этих условиях. Лучшее использование CopyOnWriteArrayList - когда чтение составляет ~ 90-95%. Слишком большая запись приведет к значительному снижению производительности (класс вызывает исключение UnsupportedOperationException при вызове compareTo, так как сортировка Collections.sort на нем ужасна).

В основном, если вы делаете ALOT из операций чтения и мало операций записи, CopyOnWriteArrayList - это фантастика, хотя если вы этого не делаете, вы можете рассмотреть Collections.synchronizedList. Если вы хотите обеспечить неблокирующее чтение, тогда, очевидно, подойдет CopyOnWriteArrayList.

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

1 голос
/ 18 июня 2010

CopyOnWriteArrayList должно работать на то, что вы хотите как List. Для Map вы можете посмотреть на ConcurrentHashMap, если только вам не нужен SortedMap, в этом случае ConcurrentSkipListMap будет лучше.

Единственная проблема, которую я вижу с ConcurrentHashMap, заключается в том, что его итераторы все еще предназначены для доступа только одного потока за раз, даже если они не выдают ConcurrentModificationException.

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