Rak*_*aks 2 java multithreading locking
我有以下课程
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和洛克班
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();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么运行此代码会导致死锁.
lock1被锁定两次:一次进入lockFirst和再次进入unlockFirst(lock1.tryLock()),但仅解锁一次unlockFirst.
ReentrantLock有一个保留计数.请参阅ReentrantLock.如果你调用tryLock,即使它已经被当前线程保持,它仍然会增加保持计数.所以,你增加两次,但只减少一次.