0

こんにちは、Java の ReadWriteLock について読んだことがありますが、その再入可能部分を理解しているかどうかはわかりません。1 つのメイン スレッドのみを使用して再入可能性を示す 2 つの簡単なコード例を次に示します。

public class Locks {
    public static void main( String[] args ) {
        ReadWriteLock lock = new ReentrantReadWriteLock();
        lock.writeLock().lock();
        lock.readLock().lock();
        System.out.println( "Reentrance acheieved" );
        lock.readLock().unlock();
        lock.writeLock().unlock();
    }
}

そして2番目の例

public class Locks {
    public static void main( String[] args ) {
        ReadWriteLock lock = new ReentrantReadWriteLock();
        lock.readLock().lock();
        lock.writeLock().lock();
        System.out.println( "Reentrance acheieved" );
        lock.writeLock().unlock();
        lock.readLock().unlock();
    }
}

最初のものでは sysout が実行されますが、2 番目のものでは実行されません。なぜですか? 両方のロックは同じスレッドによって取得されるため、ここでは再入可能な状況がありますが、書き込みロックが最初に取得された場合にのみ入口が達成されます。その他の操作 (書き込みまたは読み取り)。

4

1 に答える 1

2

答えは、「再入可能性」の下のドキュメントにあります。

このロックにより、リーダーとライターの両方が、ReentrantLock のスタイルで読み取りロックまたは書き込みロックを再取得できます。再入不可のリーダーは、書き込みスレッドによって保持されているすべての書き込みロックが解放されるまで許可されません。

さらに、ライターは読み取りロックを取得できますが、その逆はできません。他のアプリケーションの中でも、再入可能性は、読み取りロックの下で読み取りを実行するメソッドへの呼び出しまたはコールバック中に書き込みロックが保持される場合に役立ちます。リーダーが書き込みロックを取得しようとしても、成功しません。

于 2016-10-27T22:28:17.640 に答える