您好我读过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说写操作是所有的其他操作(无论是写还是读)。
答案 0 :(得分:2)
答案就在" Reentrancy":
下的文档中此锁允许读取器和写入器重新读取或写入 以ReentrantLock的风格锁定。不可重入的读者不是 允许直到写入线程持有的所有写锁定 释放。
此外,编写器可以获取读锁定,但反之亦然。 在其他应用程序中,写入锁定时重入可能很有用 在调用或回调执行读取的方法期间保持 读锁。 如果读者试图获取写锁定,它将会 永远不会成功。