我有以下课程
public class LockTester implements Runnable{
private static Locker locker = new Locker();
public static void main(String[] args){
for(int i=0;i<10;i++){
Thread t = new Thread(new LockTester());
t.start();
}
}
public void run(){
for(int i=0;i<1000;i++){
locker.unlockFirst();//note unlocking here
locker.lockFirst();
locker.lockSecond();
locker.unlockSecond();
locker.unlockFirst();
}
}
}
和储物柜类
public class Locker{
private Lock lock1 = new ReentrantLock();
private Lock lock2 = new ReentrantLock();
public void lockFirst(){
lock1.lock();
}
public void lockSecond(){
lock2.lock();
}
public void unlockFirst(){
if(lock1.tryLock()){//note change
lock1.unlock();
}
}
public void unlockSecond(){
lock2.unlock();
}
}
为什么运行这段代码会导致死锁。
lock1 被锁定两次:一次lockFirst
并再次在unlockFirst
(lock1.tryLock()
),但仅解锁一次unlockFirst
.
ReentrantLock 有一个保持计数。看可重入锁。如果调用 tryLock,即使它已被当前线程持有,它仍然会增加持有计数。因此,您将其递增两次,但仅递减一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)