Может ли одновременное чтение и запись в TreeMap вызвать бесконечные циклы - PullRequest
1 голос
/ 18 октября 2019

https://ivoanjo.me/blog/2018/07/21/writing-to-a-java-treemap-concurrently-can-lead-to-an-infinite-loop-during-reads/ демонстрирует, как несколько одновременно работающих авторов могут испортить TreeMap таким образом, что циклы создаются, и повторение структуры становится бесконечным циклом.

Возможно ли попасть вбесконечный цикл при одновременной итерации и записи не более чем с одним параллельным автором? Если нет, то может ли произойти что-либо кроме пропуска элементов, двойной обработки элементов или броска ConcurrentModificationException?

Ответы [ 2 ]

4 голосов
/ 18 октября 2019

Возможно ли также войти в бесконечный цикл при одновременной итерации и записи не более чем с одним параллельным писателем?

Я бы сказал осторожно, нет: эти бесконечные циклы возникают потому, что множественные циклыпотоки перемонтируют отношения между узлами и могут вносить противоречивые обновления. Один поток не будет конфликтовать с самим собой, поэтому такое перепутывание не будет происходить.


Однако я не уверен в этом - но мне не нужно: такойиспользование TreeMap является нарушением документации:

Если несколько потоков обращаются к карте одновременно, и хотя бы один из потоков изменяет карту структурно, она должна быть синхронизирована извне.

Если внешняя синхронизация не выполняется, поведение не определено. Разработчики класса могут свободно реализовывать класс любым способом, который соответствует спецификации;и возможно, что один из способов может привести к бесконечному циклу.

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

0 голосов
/ 18 октября 2019

Если вам нужен одновременный доступ к карте, вам придется использовать Collections.synchronizedMap. В противном случае, Донк ожидает, что он будет работать правильно.

...