java ConcurrentHashMap из Integer против HashMap из AtomicInteger против ConcurrentHashMap из AtomicInteger - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть сомнения относительно параллельной структуры данных в java, а именно:

1) ConcurrentHashMap<String, Integer>
2) HashMap<String, AtomicInteger>
3) ConcurrentHashMap<String, AtomicInteger>

Если я правильно понял:

1) чтение / запись являются потокобезопасными, только один поток может выполнить операцию записи для одной пары (чтение должно быть разрешено для всех потоков), поэтому, если другой поток должен изменить другую пару (отличается от ранее), он должен дождаться получения блокировки.

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

3) Я думаю, что с точки зрения логики c то же самое, что и в первом случае

В чем основное отличие трех вышеперечисленных структур данных?

В ситуации с многопоточностью, когда каждый поток должен одновременно включать / декодировать целочисленное значение, какой из них лучше всего выбрать?

1 Ответ

0 голосов
/ 30 апреля 2020

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

Наличие AtomicInteger в качестве значения hashmap позволяет нескольким потокам безопасно изменять значение, уже находящееся в карте.

Итак: если ваша карта устарела c (вы ничего не добавляете и не удаляете после ее создания), HashMap с AtomicInteger безопасно использовать с минимальными издержками.

Если вы добавите / удалить элементы на / с карты, используйте ConcurrentHashMap. Если вы используете Integer, вы должны установить значение на карту, чтобы изменить его. Если вы используете AtomicInteger, вы можете просто установить целочисленное значение.

...