Доступ к группам LinkedLists одновременно - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть массив LinkedLists (java.util.LinkedList), который я должен использовать.Моя цель состоит в том, чтобы иметь возможность максимизировать скорость, таким образом блокируя доступ к каждому связанному списку при использовании, но позволяя продолжать использование и не блокируя всю программу целиком

Я знаю, с помощью синхронизированного списка ссылок Java я мог бы сделать что-то вроде этого:

Queue[] linkedlistArray = new LinkedList[5]; //array of Linked Lists

//say I want to edit linklist 2, but want to allow other threads to access 
 the other linked lists 

int i = 2;
synchronized(linkedlistArray[i]){
   //edit this lift safetly
}

Есть ли решение о том, как сделать это с обычными связанными списками Java.Возможно, я мог бы сохранить массив блокировок и заблокировать соответствующую блокировку для каждого списка?Немного застрял с тем, как это сделать

1 Ответ

0 голосов
/ 06 февраля 2019

Ответов на это столько же, сколько существует ... [вставить соответствующую аналогию по своему выбору]

Есть ли чтение и запись?Относительная частота тех?

Это вообще проблема?Измеряется?Ожидания?Что за узкое место?Интересный мысленный эксперимент?

Несколько вариантов:

  1. Использовать одновременные коллекции без блокировки.см. java.util.concurrent.Редко пишешь, часто читаешь?Возможно, используйте CopyOnWriteArrayList s или, может быть, ConcurrentLinkedDeque.Посмотрите документы для java.util.concurrent пакета .

  2. Всего одна большая синхронизация / блокировка и будьте счастливы.

  3. Одна блокировка / синхронизация на список, как вы предлагаете.Просто используйте синхронизацию, как в вашем примере кода.Или отдельный объект для синхронизации, если вам нравится, или объект Lock.

  4. Может быть достаточно (не итерируя, например), чтобы просто использовать Collections.synchronizedList(...) для каждого из них, когдасоздавая их.

  5. Как 2, но используйте блокировку записи и чтения (допускается несколько одновременных читателей, но только один писатель исключительно).Смотри ReadWriteLock.Хотя будьте осторожны, редко стоит «делать что-то свое» в параллельном режиме, кроме обучения, конечно.

  6. Как 3. но используйте блокировки чтения-записи, как в 4, но делайте это согласноlist.

Я бы определенно пошел с вариантом 1 сам, не зная больше и, вероятно, даже так.Может быть, 2 или 3. Я сделал 5 и 6, но редко стоит, просто для удовольствия!

Примечание: LinkedList редко полезны на практике, автор реализации приветСам сказал, что никогда их не использует.Просто используйте ArrayList.Быстрее, меньше памяти и т. Д., Если не делать много удалений, кроме как в конце.

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