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

sro*_*ock 2 java concurrency multithreading

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

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();
}
Run Code Online (Sandbox Code Playgroud)

我上面所做的是使用ReentrantReadWriteLock,锁定'lock'进行读取,然后在其中再次尝试获取写入锁(在释放readLock之前).这可能永远不会在生产中完成,但很想知道上面的代码是否会导致死锁?

Dav*_*rtz 6

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

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

    //code....
    l.readLock().unlock();
}
Run Code Online (Sandbox Code Playgroud)

考虑两个线程是否都运行相同的代码.在第一行之后,它们都具有读锁定.现在,他们都打电话writeLock.在获得写锁定之前,两个线程都不会释放其读锁定.但是在另一个线程释放其读锁定之前,两个线程都不能获得写锁定.所以他们可以陷入僵局.

  • @ du369可以安全地实施降级锁定. (3认同)