代码之家  ›  专栏  ›  技术社区  ›  Peter Hall

如何允许同步结构的同时读取?

  •  1
  • Peter Hall  · 技术社区  · 7 年前

    假设我有这样一个简单的缓存实现:

    class Cache<Item> {
        private InternalStorage internalStorage;
    
        public synchronized Collection<Item> find(String query) {
            // find Items from internalStorage
        }
    
        public synchronized void add(Collection<Item> items) {
            // Add items to internalStorage
        }
    }
    

    我需要防止:

    1. 同时写入到 internalStorage . 也就是说,不能同时呼叫 add .
    2. 读取与写入同时发生。也就是说不能打电话 find 添加 同时。

    上面的实现满足了这些安全要求,但是,同时调用 找到 因为它不会改变数据。我如何允许这样做,同时仍然保持结构线程的安全性?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Eugene    7 年前

    如果你想使用 ReentrantReadWriteLock 而不是 synchronized 在这里。

        2
  •  0
  •   Peter Hall    7 年前

    展开 Eugene's answer . 这是如何应用 ReentrantReadWriteLock 为了实现我需要的:

    class Cache<Item> {
        final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    
        private Map<String, Item> internalStorage;
    
        public Collection<Item> find(String query) {
            rwl.readLock().lock();
            try {
                // find Items from internalStorage
                // ...
                return result;
            } finally {
                rwl.readLock().unlock();
            }
        }
    
        public void add(Collection<Item> items) {
            rwl.writeLock().lock();
            try {
                // Add items to internalStorage
                // ...
            } finally {
                rwl.writeLock().unlock();
            }
        }
    }