есть ли какой-либо параллельный LinkedHashSet в JDK6.0 или других библиотеках? - PullRequest
5 голосов
/ 13 марта 2011

мой код выдает следующее исключение:

java.util.ConcurrentModificationException
        at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
        at java.util.LinkedList$ListItr.next(LinkedList.java:696)
        at java.util.AbstractCollection.addAll(AbstractCollection.java:305)
        at java.util.LinkedHashSet.<init>(LinkedHashSet.java:152)
        ...

Я хочу ConcurrentLinkedHashSet исправить это,

, но я нашел только ConcurrentSkipListSet в java.util.concurrent, это TreeSet, не LinkedHashSet

Есть ли простой способ получить ConcurrentLinkedHashSet в JDK6.0?

спасибо за помощь:)

Ответы [ 4 ]

10 голосов
/ 13 марта 2011

Исключение ConcurrentModificationException не имеет ничего общего с параллелизмом в той форме, о которой вы думаете.Это просто означает, что во время итерации по Коллекции кто-то (возможно, ваш собственный код - это происходит достаточно часто;)) меняет его, то есть добавляет / удаляет некоторые значения.

Убедитесь, что вы используете Итератор дляудалить значения из коллекции, а не саму коллекцию.

Редактировать: Если действительно другой поток одновременно получает доступ к Коллекции, слабая синхронизация, которую вы получаете из стандартной библиотеки, в любом случае бесполезна, так как вы должны заблокировать Коллекцию на все время операции.не только для одного добавить / удалить!Т.е. что-то вроде

synchronize(collection) {
   // do stuff here
}
4 голосов
/ 13 марта 2011

Вы всегда можете создать синхронизированную коллекцию с помощью Collections.synchronizedMap(myMap);.Однако попытка изменить карту во время итерации (которая, как я полагаю, является причиной вашей ошибки) все равно будет проблемой.

Из документов для synchronizedMap:

Возвращает синхронизированную (поточно-ориентированную) карту, поддерживаемую указанной картой.Чтобы гарантировать последовательный доступ, очень важно, чтобы весь доступ к резервной карте осуществлялся через возвращенную карту.

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

Это потому, что

  • обычно параллельная коллекция действительно гарантируетatomic get / put, но не блокирует всю коллекцию во время итерации, что было бы слишком медленно.Там нет гарантии параллелизма над итерацией, которая на самом деле много операций с картой.

  • это не совсем параллелизм, если вы изменяете во время итерации, так как невозможно определить правильное поведение - например,Как вы примирите свой итератор, возвращающий hasNext == true с удалением (возможно, следующего значения) из коллекции?

2 голосов
/ 13 декабря 2013

Есть ConcurrentLinkedHashMap - https://code.google.com/p/concurrentlinkedhashmap/

Вы можете создать Set из него с помощью java.util.Collections.newSetFromMap (map)

0 голосов
/ 13 марта 2011

К сожалению нет. Вы можете реализовать свои собственные, оборачивая ConcurrentHashMap и ConcurrentLinkedQueue, но это не позволит вам легко удалять значения (удаление будет O (N), так как вам придется перебирать все в очереди) ...

Для чего вы используете LinkedHashSet? Может предложить альтернативы ...

...