【问题标题】:How to implement A Cache by using ReadWriteLock in java?如何在java中使用ReadWriteLock实现A Cache?
【发布时间】:2015-10-15 15:24:47
【问题描述】:

我的主要问题是“我真的需要重新检查以下代码中的”吗?
以下代码描述了如何使用 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 时)并且它不能t 是我们主 obj 的状态变量:ReadWriteLockCache。
我们真正应该做的是调用get方法,检查key的值是否被其他线程放入。

代码应该是这样的:

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

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

【问题讨论】:

  • 你从哪里得到这个 ReadWriteLockCache 的例子?
  • 你可以用 ConcurrentHashMap 和几行代码实现同样的效果。
  • @peter.petrov 我从一个网站得到了代码,我仍然可以在许多搜索引擎结果中找到代码。这就是为什么我很困惑,因为我无法得到正确的实现。
  • @assylias 我猜你的意思是代码解决方案是在 ConcurrentHashMap 中使用 putIfAbsent ?我使用 RWL 来做到这一点是因为性能。在我的情况下,读取线程或计数远远超过写入。
  • @scugxl CHM 不会锁定 get 操作,所以老实说,我不太确定您的方法是否表现更好......您应该在得出任何结论之前运行性能测试。

标签: java dictionary readwritelock


【解决方案1】:

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

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

【讨论】:

  • 如果评论不包含工作代码并且是建议/提示,请考虑将其放入 cmets。
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多