У меня есть доступ к объекту List из нескольких потоков. В основном это один поток, а в некоторых случаях два потока, которые обновляют список. Есть от одного до пяти потоков, которые могут читать из этого списка, в зависимости от количества обрабатываемых пользовательских запросов. Список - это не очередь задач, которые нужно выполнить, это список объектов домена, которые извлекаются и обновляются одновременно.
Теперь есть несколько способов сделать доступ к этому списку потокобезопасным:
-использовать синхронизированный блок
-использовать обычную блокировку (т.е. операции чтения и записи используют одну и ту же блокировку)
-использовать ReadWriteLock
-использовать один из новых классов коллекции ConcurrentBLABLBA
Мой вопрос:
Каков оптимальный подход, учитывая, что критические разделы обычно не содержат большого количества операций (в основном, просто добавления / удаления / вставки или получения элементов из списка)?
Можете ли вы порекомендовать другой подход, не указанный выше?
Некоторые ограничения
-оптимальная производительность имеет решающее значение, использование памяти не так много
-это должен быть упорядоченный список (в настоящее время синхронизирующийся с ArrayList), хотя и не отсортированный список (т.е. не отсортированный с помощью Comparable или Comparator, но в соответствии с порядком вставки)
-список будет большим, содержит до 100000 объектов домена, поэтому использование чего-то вроде CopyOnWriteArrayList невозможно
-запись / обновление циклические разделы обычно очень быстрые, выполняются простые операции добавления / удаления / вставки или замены (установки)
- операции чтения большую часть времени будут выполнять в основном вызов elementAt (index), хотя некоторые операции чтения могут выполнять двоичный поиск, или indexOf (element)
-не выполняется прямая итерация по списку, хотя такая операция, как indexOf (..), будет проходить по списку