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

How to allow simultaneous reads from a synchronized structure?

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

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. 读取与写入同时发生。即不能同时调用 findadd

上面的实现满足了这些安全要求,但是,同时调用 find 并没有什么坏处,因为它不会更改数据。我怎样才能允许这样做,同时仍然保持结构线程安全?

如果您在这里使用 ReentrantReadWriteLock 而不是 synchronized,这似乎很容易做到。

展开。这是如何应用 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();
        }
    }
}