我有一个大小为2的预定执行程序池。1个线程每秒填充一个映射,第二个线程需要获取映射中的数据并将其持久保存到数据库中并清除映射中的数据。在两个线程之间共享映射以便不丢失数据的最佳方法是什么?
答案 0 :(得分:0)
JSON.stringify(groups || null) === JSON.stringify(checkedgroups || null)
是共享资源,为了获得正确的结果,我们需要控制多线程访问map
,我们可以使用很多方法:
map
之类的线程安全映射在您描述的场景中,此锁是最简单的方法,代码如下:
ConcurrentHashMap
为什么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();
}
}
对您来说不是一个完美的解决方案?
线程2需要先读取地图然后写入(清除)地图,但是在ConcurrentHashMap
中,检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。 >