gpt4 book ai didi

java - 如何在java中使用ReadWriteLock实现A Cache?

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:03 27 4
gpt4 key购买 nike

我的主要问题是“我真的需要重新检查以下代码中的”吗?
下面的代码描述了如何使用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行时必须为null,
因为它是一个局部变量(当它为null时)并且它不能是我们的主对象:ReadWriteLockCache的状态变量。
我们真正应该做的是调用 get 方法,并检查键的值是否由其他线程放入。

代码应该是这样的:

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

有人可以帮忙吗?我说得对吗?我很困惑。

最佳答案

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

但正如其他人建议的那样,使用并发 HashMap

关于java - 如何在java中使用ReadWriteLock实现A Cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152477/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com