线程1每秒填充一次地图,线程2每60秒保存一次条目

时间:2019-01-23 18:54:07

标签: java concurrency

我有一个大小为2的预定执行程序池。1个线程每秒填充一个映射,第二个线程需要获取映射中的数据并将其持久保存到数据库中并清除映射中的数据。在两个线程之间共享映射以便不丢失数据的最佳方法是什么?

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)重叠。 >