同时阅读但锁定编辑

reading concurrently but locking with edits

我正在寻找一种解决方案,它允许多个线程读取共享资源(允许并发),但一旦线程进入一个可变块就会锁定这些读取线程,以实现两全其美。

class Foo {

    Map<String, String> sharedResource;

    public void read() // multiple reading threads allowed, concurrency ok, lock this only if a thread enters the mutating block below.
    {
         // read concurrently unless a thread enters mutating blocks add/remove
    }

    public void add() // this should lock any threads entering this block as well as lock the reading threads above
    {
        synchronized(sharedResource) // lock remove and read
        {
        }
    }

    public void remove() // lock add and read
    {
        synchronized(sharedResource)
        {
        }
    }
}

Java有这样的解决方案吗?

这是一个经典的read/write锁定方案:

class Foo {

    Map<String, String> sharedResource;
    ReadWriteLock lock = new ReentrantReadWriteLock();

    public void read() {
         lock.readLock().lock();
         try {
             // read
         } finally {
             lock.readLock().unlock();
         }
    }

    public void add() {
         lock.writeLock().lock();
         try {
             // add
         } finally {
             lock.writeLock().unlock();
         }
    }

    public void remove() {
         lock.writeLock().lock();
         try {
             // remove
         } finally {
             lock.writeLock().unlock();
         }
    }
}

读锁可以共享,写锁是读写互斥的