У меня есть следующий класс:AtomicLongMap чтения потокобезопасность
public class Storage {
protected static final AtomicLongMap<String> MAP;
protected Storage() {
MAP= AtomicLongMap.create();
}
public void decrement(String id) {
long num = MAP.get(id);
if (num != 0) {
MAP.decrementAndGet(id);
}
}
public void putIntoActiveAgents(String id, Integer num) {
MAP.put(id, num);
}
public void remove(String id) {
MAP.remove(id);
}
public Long get(String id) {
return MAP.get(ID);
}
}
В моем случае я скажем 6 темы, которые исполнительское подобные вещи: Каждый из них проверяет нить, если долго на карте равен 1, если нет, они называют декремент, если да, они вызывают удаление. Всюду я читал, что AtomicLongMap является потокобезопасным. Я уверен, что это когда кто-то увеличивает или уменьшает длинные числа, но я не уверен, что он по-прежнему является потокобезопасным, когда другой поток считывает значения с этой карты. Мой сценарий: 1. Thread A считывает значение с карты - это 2 (поэтому он уменьшает значение) 2. Thread B считывает значение до того, как счетчик был уменьшен - он все равно возвращает 2, поэтому он также уменьшает значение. 3. В результате никто не видит, что значение установлено равным 1.
Мой вопрос в таком случае, мне нужно сделать MAP синхронизированным?
Вы не производите синхронизацию поля или объекта. Вы выполняете синхронизацию методов или блоков кода. Ваш метод decment() не является потокобезопасным (т. Е. Не атомарным), и ваш сценарий, когда потоки проверяют значение, а затем либо уменьшают, либо удаляют, также не являются потокобезопасными. Сначала вы должны инкапсулировать это в метод. А затем сделайте этот метод потокобезопасным. –
Вы ищете 'ConcurrentHashMultiset'? –