【问题标题】:Java ReadWriteLock ReentranceJava ReadWriteLock 重入
【发布时间】:2016-10-27 22:12:07
【问题描述】:

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

【问题讨论】:

标签: java multithreading readwritelock reentrantreadwritelock


【解决方案1】:

答案就在“Reentrancy”下的文档中:

此锁允许读取器和写入器重新获取读取或写入 以 ReentrantLock 的样式锁定。不可重入的读者不是 直到写线程持有的所有写锁都被允许 发布。

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

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多