1

我有一个类有 2 种方法,读取方法和写入方法。我希望多线程可以访问读取方法,并且只有 1 个线程可以访问读取方法。并且当写入方法被访问时,读取方法将被阻塞。我该怎么做?

注意:在阅读了我为此编写了一小段代码的答案后,我使用了并发包锁。

public class ConcurrentLock {
private Lock wLock = new Lock();
private Lock rLock = new Lock();
private int i;
public static void main(String[] args){

}
public int Read(){
    try {
        rLock.lock();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        rLock.unlock();
    }
    return i;
}

public void Write(){
    try {
        wLock.lock();
        rLock.lock();
        ++i;
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        wLock.unlock();
        rLock.unlock();
    }

}

}

4

3 回答 3

3

这是Readers-Writer 模式,您可以直接在 Java 5+ 中使用ReadersWriteLock.java可能的实现来实现这一点。您必须获取并释放适当的读取器和写入器锁。有关示例,请参阅 Javadoc。

请注意,即使在您的 OP 中不是很清楚,阻止尝试读取的线程因为另一个已经在读取是没有意义的,只会增加争用。应该允许两个读者同时阅读。但是,作者应该拥有独占访问权。

于 2013-02-18T18:53:18.930 回答
1

原生方式;)

public void read() {
      synchronized(readLock) {
           // critical operations like resource.get(Some)
      }
}
public void write() {
      synchronized(writeLock) {
           synchronized(readLock) {
              // critical operations like resource.put(Some, Some)
           }
      }
}

// for the academic

public void onlyOneReaderAndOnlyOneWriter() {
      writeLock = readLock;
}

public void multipleReadersAndOnlyOneWriter() {
     synchronized(readLock) { // grr, tricky
         writeLock = new Object();
     }
}
于 2013-02-18T18:58:40.700 回答
0

将它们都标记为同步。

于 2013-02-18T18:53:05.270 回答