блокировка диапазона в Java - PullRequest
7 голосов
/ 21 июля 2010

У меня большой массив для доступа к нескольким потокам.Одиночная блокировка недостаточно эффективна. Есть ли класс блокировки диапазона в Java или Scala?

Ответы [ 4 ]

6 голосов
/ 21 июля 2010

Не в стандартных библиотеках. ConcurrentHashMap делает это, хотя, внутренне представляя хеш-таблицу как «сегменты» (16 из них по умолчанию), где каждый из них защищен отдельной блокировкой. Кроме того, этот поток задает тот же вопрос, за исключением ArrayList вместо массива. Хотя это бесполезно, оно предлагает альтернативы, если вы можете пойти на компромисс в использовании.

Обновление: возможно, AtomicReferenceArray и друзей обеспечат требуемую эффективность, в то же время обеспечивая семантику изменчивого доступа к "элементы массива" ( JCIP 15,3).

2 голосов
/ 22 июля 2010

Говоря в общем, кроме случаев, когда у вас есть действительно специфическая потребность в плане параллелизма, вы найдете очень оптимизированные и удобные объекты в пакете java.util.concurrent jdk.

Я могу предложить книгу Брайана Гетца "Параллелизм на практике на Java", очень хорошую книгу, в которой объясняется множество вещей, касающихся потоков в пакетах java и java.util.concurrent.

1 голос
/ 21 июля 2010

Обернуть массив внутри потокобезопасного объекта, который контролирует доступ.Вы можете сами управлять диапазонами или разбить массив на диапазоны, каждый со своей блокировкой, и ссылаться на него таким образом.

0 голосов
/ 22 июля 2010

Это действительно зависит от вашего использования.Если вы на самом деле имеете в виду ArrayList , а не просто массив, то вам, вероятно, придется свернуть свои собственные и снять блокировки, поскольку ArrayList может изменять размер, что может привести к несинхронизированному чтению и записи.1004 * Если, однако, вы имеете в виду массив , я не уверен, что понимаю, что вы имеете в виду.Вам не нужен замок, все будет работать без замков.Другая нить может не сразу увидеть изменения, но это не конец света.

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