Общий ресурс map
, чтобы получить правильный результат, нам нужно контролировать многопоточный доступ map
. Можно использовать много методов:
- используйте многопоточную карту типа
ConcurrentHashMap
- использовать блокировку для управления доступом к общему ресурсу несколькими потоками
- изменить процесс, чтобы выполнить сериализацию операции.
В сцене, которую вы описали, блокировка с использованием thisk - самый простой метод, код такой:
private Lock lock = new ReentrantLock();
private Map<String, Object> dataSet = new HashMap<>();
private void fillDataSet(Map<String, Object> src) {
lock.lock();
try {
dataSet.putAll(src);
} finally {
lock.unlock();
}
}
private void dumpDataSet() {
lock.lock();
try {
// save data to db adn clear the data set
db.saveData(dataSet);
dataSet.clear();
} finally {
lock.unlock();
}
}
Почему ConcurrentHashMap
не идеальное решение для вас?
Thread2 должен прочитать карту и затем написать (очистить) карту ,, но в ConcurrentHashMap
операции поиска (включая получение) обычно не блокируются, поэтому могут перекрываться с операциями обновления (включая операции добавления и удаления).