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

问题描述 投票:1回答:2

假设我有一个简单的缓存实现,如下所示:

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没有任何危害,因为它不会改变数据。我怎样才能允许这一点,同时仍保持结构线程安全?

java concurrency synchronized
2个回答
3
投票

如果你在这里使用ReentrantReadWriteLock而不是synchronized,这似乎相当容易。


0
投票

扩展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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.