HashMap ведет себя некорректно в многопоточном приложении Java, как исправить? [дубликат]JAVA

Программисты JAVA общаются здесь
Anonymous
HashMap ведет себя некорректно в многопоточном приложении Java, как исправить? [дубликат]

Сообщение Anonymous »

Я использую HashMap в приложении Java, где несколько потоков одновременно добавляют и считывают данные. Иногда значения отсутствуют или неверны, а иногда программа зависает. Я знаю, что HashMap не является потокобезопасным, но я не до конца понимаю, что именно может пойти не так внутри.
Вот упрощенный пример:

Код: Выделить всё

Map map = new HashMap();

Runnable writer = () -> {
for (int i = 0; i < 1000; i++) {
map.put("key" + i, i);
}
};

Runnable reader = () -> {
for (int i = 0; i < 1000; i++) {
Integer value = map.get("key" + i);
if (value != null) {
System.out.println(value);
}
}
};

Thread t1 = new Thread(writer);
Thread t2 = new Thread(reader);

t1.start();
t2.start();
Я вижу пропущенные записи, и иногда программа зависает. Я пробовал Collections.synchronizedMap, но он кажется медленнее.
  • Почему HashMap не работает в многопоточных сценариях?
  • Какие внутренние проблемы вызывают повреждение данных или зависание данных?
  • Какова лучшая поточно-безопасная альтернатива для частого чтения и записи?
Мне нужно решение, которое является потокобезопасным, высокопроизводительным и не блокирует потоки без необходимости.

Вернуться в «JAVA»