java线程1每秒填充一个映射,线程2每60秒保存一个条目 5 月,2 周 Questions & Answers 29 我有一个2号的计划执行人池。1个线程每秒填充一个映射,第二个线程需要获取映射中的数据并将其持久化到数据库,然后清除映射中的数据。在两个线程之间共享映射以避免数据丢失的最佳方法是什么
# 1 楼答案 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(); } } 为什么ConcurrentHashMap对你来说不是一个完美的解决方案 Thread2需要读取映射,然后写入(清除)映射,但是在ConcurrentHashMap中,检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠
# 1 楼答案
map
是一个共享资源,为了得到正确的结果,我们需要控制多个线程访问map
,我们可以使用很多方法:ConcurrentHashMap
这样的线程安全映射在你描述的场景中,使用锁是最简单的方法,代码如下:
为什么
ConcurrentHashMap
对你来说不是一个完美的解决方案Thread2需要读取映射,然后写入(清除)映射,但是在
ConcurrentHashMap
中,检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠