java - ReentrantReadWriteLock(java)-在读取锁内嵌套写入锁

标签 java multithreading concurrency

在下面的代码片段中,是否会导致死锁?

public class TestLocks {

ReadWriteLock lock = new ReentrantReadWriteLock();
public void add() {
    lock.readLock().lock();
    //code.....

    lock.writeLock().lock();
    //code
    lock.writeLock().unlock();

    //code....
    l.readLock().unlock();
}

我在上面做的是使用ReentrantReadWriteLock,将锁“lock”用于读取,然后在其中再次尝试获取用于写入的锁(在释放readLock之前)。这可能永远不会在生产中完成,但好奇地想知道上面的代码是否会导致死锁?

最佳答案

public void add() {
    lock.readLock().lock();
    //code.....

    lock.writeLock().lock();
    //code
    lock.writeLock().unlock();

    //code....
    l.readLock().unlock();
}

考虑两个线程是否都运行相同的代码。在第一行之后,它们都具有读取锁定。现在,他们都调用writeLock。在获得写锁定之前,这两个线程都不会释放其读锁定。但是任何一个线程都无法获得写锁定,直到另一个线程释放其读锁定。这样他们就可以陷入僵局。

关于java - ReentrantReadWriteLock(java)-在读取锁内嵌套写入锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26110579/

相关文章:

java - Java 中的全局代码初始化

java - Findbugs - 对 java.util.concurrent.ConcurrentHashMap 的调用序列可能不是原子的

c++ - 简单的无锁 MPSC 环形缓冲区的问题

sql-server - SQL Server 意图锁是如何工作的?

java - 在 AppCompatActivity 中使用 ViewModelProvider(this) 时出现运行时错误

java - @TestSubject 和@InjectMocks 之间的区别?

java - 如何找出真正需要的包?

使用 winsock 和 std::thread 的 C++ 多线程服务器

java - Java应用程序中CPU核心数和线程数之间的关系是什么?

java - 在一个类中处理多个线程的最佳方法是什么