Java中的共享集合锁定

ova*_*vay 3 java shared locking object

我有一个包含两个带有一些数据的Hashmaps的类.我希望每晚在地图中更新/重新加载数据(使用Quartz作业),并希望在数据刷新过程中锁定所有其他线程.

 public class A {

    private Map<String, Object> someMap1 = new ConcurrentHashMap<String, Object>();
    private Map<String, Object> someMap2 = new ConcurrentHashMap<String, Object>();

    public void reloadData() {
        someMap1.clear();
        someMap2.clear();

        // read new data here and re-fill the maps
        ...
    }

    public Object getDataFromMap(String key) {
        // do some logic here and return data from map
        return someObj;
    }
 }
Run Code Online (Sandbox Code Playgroud)

对于所有"读者"线程,getDataFromMap()方法应该是可访问的,而不会在数据刷新过程中出现任何阻塞.

另一方面,reloadData()方法应等待所有"读者"完成,然后阻止映射读取和重新加载数据.

reloadData()的'synchronized'修饰符不是解决方案,因为它阻止所有类和所有'读者',如果它们在getDataFromMap()逻辑中正在进行中.

Mas*_*_mj 5

在java中的并发包中使用Lock类.它有ReenterantReadWriteLock.


Ami*_*nde 5

您的要求非常适合ReentrantReadWriteLock

    private Map<String, Object> someMap1 = new ConcurrentHashMap<String, Object>();
    private Map<String, Object> someMap2 = new ConcurrentHashMap<String, Object>();
    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private final Lock r = rwl.readLock();
    private final Lock w = rwl.writeLock();

    public Object getDataFromMap(String key) {
        r.lock();
        try {
            // do some logic here and return data from map
            return someObj;
        } finally {
            r.unlock();
        }
    }

    public void reloadData() {
        w.lock();
        try {
            someMap1.clear();
            someMap2.clear();
            // read new data here and re-fill the maps
        } finally {
            w.unlock();
        }
    }
Run Code Online (Sandbox Code Playgroud)