Java ReadWriteLock Reentrance

时间:2016-10-27 22:12:08

标签: java multithreading readwritelock reentrantreadwritelock

您好我读过Java中的ReadWriteLock,但我不确定我是否已经掌握了它的重入部分。 这里有两个简短的代码示例,只使用一个主线程来显示重入

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();
    }
}

和第二个例子

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但不在第二个中执行,为什么会这样?这两个锁都是由同一个线程获得的,所以我们在这里有一个重入情况,但只有当首先获得writelock时才能实现入口,这很奇怪,因为在非重入情况下,doc说写操作是所有的其他操作(无论是写还是读)。

1 个答案:

答案 0 :(得分:2)

答案就在" Reentrancy":

下的文档中
  

此锁允许读取器和写入器重新读取或写入   以ReentrantLock的风格锁定。不可重入的读者不是   允许直到写入线程持有的所有写锁定   释放。

     

此外,编写器可以获取读锁定,但反之亦然。   在其他应用程序中,写入锁定时重入可能很有用   在调用或回调执行读取的方法期间保持   读锁。 如果读者试图获取写锁定,它将会   永远不会成功。