0

メインスレッドに次のようなメソッドがあり、次のようにデータ構造でメソッドを呼び出します-:

public static void main(String[] args){

data_structure_object.insert(value);
}

スレッドの干渉を防ぐために使用されるデータ構造クラス内で rwLock と呼ばれる ReadWrite オブジェクトを使用しています。Read Write クラスは次のようになります。

public class ReadWriteLocks {

    // these 3 variables help in creating a read write lock
    private int numberOfReaders = 0;
    private int numberOfWriters = 0;
    private int numberOfWriteRequests = 0;

    // getter method for the number of readers
    public int getNumberOfReaders() {
        return this.numberOfReaders;
    }

    // getter method for the number of writers
    public int getNumberOfWriters() {
        return this.numberOfWriters;
    }

    // getter method for the number of write requests
    public int getNumberOfWriteRequests() {
        return this.numberOfWriteRequests;
    }

    // this function checks if a thread can acquire the lock
    public synchronized void lockRead() throws InterruptedException {

        while (numberOfWriters > 0 || numberOfWriteRequests > 0)
            this.wait();
    }

    // this function unlocks a lock occupied by a reader thread
    public synchronized void unlockRead() {

        // decrement the number of readers
        --numberOfReaders;
        notifyAll();
    }

    // this function checks if a thread can acquire the write lock
    public synchronized void lockWrite() throws InterruptedException {

        // increase the number of write requests
        ++numberOfWriteRequests;

        while (numberOfReaders > 0 || numberOfWriters > 0)
            this.wait();

        --numberOfWriteRequests;
        ++numberOfWriters;
    }

    // this function is used to take a thread away from the lock
    public synchronized void unlockWrite() {

        // decrement the number of writers
        --numberOfWriters;

        // notify all the threads
        this.notifyAll();
    }

}

データ構造の挿入メソッド内に、次のコード スニペットを含めます。

// acquire the read/write lock
        try {
            rwLock.lockRead();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Some operation

        // release the lock
        rwLock.unlockRead();

問題は、これは公平性を確保し、データ構造の一貫性を維持するためにスレッドをロックする有効な方法ですか? また、これらすべてに加えて、次の機能を提供する方法を理解できません-「複数のリーダーがロックを取得し、リソースを要求または書き込みするライターがなくなるまでデータを読み取ることを許可する」、私はかなり混乱しています状況は親切に助けます。

4

1 に答える 1

0

ReadWriteLock完全に適切な既存のポージングを複製しようとしているという事実とは別に、ReentrantReadWriteLockコードには 2 つの特定の問題があります。

  1. インスタンス変数はvolatile.

    private volatile int numberOfReaders = 0;
    private volatile int numberOfWriters = 0;
    private volatile int numberOfWriteRequests = 0;
    
  2. ロック要求からロックへの移行には注意が必要です。

    --numberOfWriteRequests;
    ++numberOfWriters;
    

おそらくそうあるべきです

    ++numberOfWriters;
    --numberOfWriteRequests;

これらの 2 つの命令の間に、numberOfWriteRequestsゼロとゼロの瞬間がある可能性があるためnumberOfWritersです。これにより、スピンがループしlockReadてアウトになり、物事が壊れる可能性があります...時々。

これをコードレビューに移すのがおそらく最善でしょう。

于 2013-09-20T22:54:31.920 に答える