1

ReadメソッドとWriteメソッドの2つのメソッドを持つクラスが1つあります。マルチスレッドがreadメソッドにアクセスでき、1つのスレッドだけがreadメソッドにアクセスできるようにしたい。また、writeメソッドにアクセスすると、readメソッドがブロックされます。どうすればいいですか?

注:回答を読んだ後、このための小さなコードを書いた後、同時パッケージロックを使用しました。

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パターンです。Java5以降では、 ReadersWriteLock.javaの可能な実装を直接使用して、まさにそれを実現できます。適切なリーダーとライターロックを取得して解放する必要があります。例については、Javadocを参照してください。

OPではあまり明確ではありませんが、別のスレッドが既に読み取りを行っているために読み取りを試みるスレッドをブロックしても意味がなく、競合が増えるだけであることに注意してください。2人のリーダーが同時に読み取ることを許可する必要があります。ただし、ライターは排他的にアクセスできる必要があります。

于 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 に答える