Ответов на это столько же, сколько существует ... [вставить соответствующую аналогию по своему выбору]
Есть ли чтение и запись?Относительная частота тех?
Это вообще проблема?Измеряется?Ожидания?Что за узкое место?Интересный мысленный эксперимент?
Несколько вариантов:
Использовать одновременные коллекции без блокировки.см. java.util.concurrent.Редко пишешь, часто читаешь?Возможно, используйте CopyOnWriteArrayList
s или, может быть, ConcurrentLinkedDeque
.Посмотрите документы для java.util.concurrent пакета .
Всего одна большая синхронизация / блокировка и будьте счастливы.
Одна блокировка / синхронизация на список, как вы предлагаете.Просто используйте синхронизацию, как в вашем примере кода.Или отдельный объект для синхронизации, если вам нравится, или объект Lock
.
Может быть достаточно (не итерируя, например), чтобы просто использовать Collections.synchronizedList(...)
для каждого из них, когдасоздавая их.
Как 2, но используйте блокировку записи и чтения (допускается несколько одновременных читателей, но только один писатель исключительно).Смотри ReadWriteLock
.Хотя будьте осторожны, редко стоит «делать что-то свое» в параллельном режиме, кроме обучения, конечно.
Как 3. но используйте блокировки чтения-записи, как в 4, но делайте это согласноlist.
Я бы определенно пошел с вариантом 1 сам, не зная больше и, вероятно, даже так.Может быть, 2 или 3. Я сделал 5 и 6, но редко стоит, просто для удовольствия!
Примечание: LinkedList
редко полезны на практике, автор реализации приветСам сказал, что никогда их не использует.Просто используйте ArrayList
.Быстрее, меньше памяти и т. Д., Если не делать много удалений, кроме как в конце.