在下面的代码段中,是否会导致死锁?
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,锁定'锁定'阅读和内部再次尝试获取写入锁(在释放readLock之前)。这可能永远不会在生产中完成,但很想知道上面的代码是否会导致死锁?
答案 0 :(得分:5)
public void add() {
lock.readLock().lock();
//code.....
lock.writeLock().lock();
//code
lock.writeLock().unlock();
//code....
l.readLock().unlock();
}
考虑两个线程是否都运行相同的代码。在第一行之后,它们都具有读锁定。现在,他们都打电话给writeLock
。在获得写锁定之前,两个线程都不会释放其读锁定。但是在另一个线程释放其读锁定之前,两个线程都不能获得写锁定。所以他们可以陷入僵局。