有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程1每秒填充一个映射,线程2每60秒保存一个条目

我有一个2号的计划执行人池。1个线程每秒填充一个映射,第二个线程需要获取映射中的数据并将其持久化到数据库,然后清除映射中的数据。在两个线程之间共享映射以避免数据丢失的最佳方法是什么


共 (1) 个答案

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