У меня вопрос о ConcurrentHashMaps. Допустим, у меня есть 2 потока. Thread A пытается получить объект из общей ConcurrentHashMap. Нить В очищает общую карту. Что произойдет, если Thread A и Thread B одновременно получат доступ к совместно используемому ресурсу. Я искал документацию и Интернет и не мог найти окончательного ответа, также пытался сделать это сам, но безрезультатно.ConcurrentHashmap одновременная запись и получение операций
ответ
ConcurrentHashMap разделен на сегменты на основе уровня параллелизма. Таким образом, различные потоки могут одновременно обращаться к различным сегментам в java.
Могут ли потоки читать сегмент ConcurrentHashMap, запертый некоторыми другими потоком в java?
Да. Когда поток блокирует один сегмент для обновления, он не блокирует его для извлечения (выполняется методом get), поэтому какой-либо другой поток может считывать сегмент (методом get), но он сможет считывать данные перед блокировкой.
Для операций, таких как putAll одновременное извлечение может отражать удаление только некоторых записей. Для операций, таких как clear одновременное извлечение может отражать удаление только некоторых записей.
Не может быть двух потоков , изменяя одновременно. Весь смысл использования таких структур данных состоит в том, что они предотвращают более одного потока , обновляя, что «внутренние внутренние данные» одновременно.
Наличие двух потоков, которые меняют карту в тот же момент времени, это не возможно. Потому что код внутри этого ConcurrentHashMap не будет позволяет двух потоков для манипулирования вещами параллельно!
Но: когда один нить только чтение, а другой обновление что данные; все по-другому! Поскольку часть , читающая, может «входить» в критическую секцию, даже если она в настоящее время принадлежит другому потоку.
Я думаю, что он спрашивает о 'get' и' remove' в одно и то же время. Javadocs * Операции поиска (включая get) обычно не блокируются, поэтому могут перекрываться с операциями обновления (включая put и remove) * –
Спасибо и обновлены! – GhostCat
Одновременно могут меняться две темы, цель «ConcurrentHashMap» заключается не в том, чтобы помешать ей, а в том, чтобы иметь «_полный параллелизм поиска и высокий ожидаемый параллелизм для обновлений», так что он сохраняет согласованные внутренние структуры, обеспечивая при этом хорошая производительность. –
документация вполне понятно об этом случае:
операция Retrieval (включая ГЕТ), как правило, не блокирует, поэтому может перекрытия с операциями обновления (в том числе на место и удалить).
Итак, если два потока используют ресурс одновременно, но один читает, а другой обновляет, вы можете прочитать ресурс, который недоступен.
Для получения дополнительной информации проверьте documentation paragraph 2
SBabach, это называется «Concurrent» HashMap. Вы не можете получить доступ к своим функциям одновременно ...Таким образом, поведение, о котором вы просите, никогда не произойдет :) –
Примечание: один поток всегда идет первым, потому что он не может одновременно обращаться к одному и тому же ключу. Вы можете или не можете видеть объект в зависимости от того, когда сначала выполняется операция над этим ключом. –
Последняя часть звучит загадочно «... тоже пыталась сделать это сама, но безрезультатно». Действительно? Не было никакого результата? Карта вернулась кошке Шредингера все время? – Holger