0

嗨,我已经阅读了 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 时才能实现入口,这很奇怪,因为在不可重入的情况下,文档说写操作对所有线程都是独占的其他操作(无论是写还是读)。

4

1 回答 1

2

答案就在“可重入”下的文档中:

此锁允许读取器和写入器以 ReentrantLock 的样式重新获取读取或写入锁。在写线程持有的所有写锁都被释放之前,不允许非重入读者。

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

于 2016-10-27T22:28:17.640 回答