1

我的主要问题是“我真的需要重新检查以下代码中 的值”吗?
以下代码描述了如何使用 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'的值?

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

代码应该是这样的:

                    value = cache.get(key);
                if (value == null) //line3
                 {
                    value = "aaaa"; 
                    cache.put(key, value);
                }

任何人都可以帮忙吗?我说的对吗?我很困惑。

4

1 回答 1

0

是的,您应该因为多个线程可以同时读取读锁,所以可能有一个线程执行第 3 行,而其他线程可能在第 2 行等待

但正如其他人建议的那样使用并发哈希图

于 2019-05-29T00:19:58.977 回答