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