Java ReadWriteLock Reentrance



嗨,我读过关于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,但在第二个中没有,为什么会这样?这两个锁都是由同一个线程获得的,所以我们这里有一个重入的情况,但是只有当先获得写锁时才会实现重入,这很奇怪,因为在不可重入的情况下,文档说写操作与所有其他操作(无论是写还是读)都是排他的。

答案就在文档"Reentrancy"下面:

该锁允许读和写都可以重新获取读或写以ReentrantLock的样式锁定。不可重入的阅读器则不是允许,直到写线程持有的所有写锁都被占用释放。

另外,写操作可以获得读锁,反之则不行。在其他应用程序中,重入在写锁时很有用在调用或回调执行读取的方法期间保留读锁。如果一个读操作试图获取写锁,它就会获得从来没有成功。

相关内容

  • 没有找到相关文章

最新更新