如何在java中使用ReadWriteLock实现缓存



我的主要问题是"我真的需要在以下代码中重新检查吗?"
下面的代码描述了如何使用ReadWriteLock实现缓存。

public class ReadWriteLockCache {
private Map<String, Object> cache = new HashMap<String, Object>();
private ReadWriteLock rwl = new ReentrantReadWriteLock();
/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
}
public Object getData(String key) {
    rwl.readLock().lock();
    Object value = null;
    try {
        value = cache.get(key);
        if (value == null) {
            rwl.readLock().unlock(); //line1
            rwl.writeLock().lock(); //line2
            try {
                if (value == null) //line3
                 {
                    value = "aaaa"; // may get data from db
                                    //line5 put the data into cache.
                    cache.put(key, value);
                }
            } finally {
                rwl.writeLock().unlock();
            }
            rwl.readLock().lock();
        }
    } finally {
        rwl.readLock().unlock();
    }
    return value;
}

}

我是否还需要重新检查'line3'的值?

据我所知,值对象必须是空的,当执行到line3,
因为它是一个局部变量(当它是空的),它不能是我们的主对象的状态变量:ReadWriteLockCache。
我们真正应该做的是调用get方法,检查键的值是否由其他线程输入

代码应该是这样的:
                    value = cache.get(key);
                if (value == null) //line3
                 {
                    value = "aaaa"; 
                    cache.put(key, value);
                }

有人能帮忙吗?我说的对吗?我困惑。

可以,因为读锁可以被多个线程同时读可能有一个线程在执行第3行,而另一个线程可能在第2行等待

但是其他人建议使用并发hashmap

相关内容

  • 没有找到相关文章

最新更新