这段代码展示了Java中的一个死锁示例,强制Thread1在resource1上获取lock1,强制Thread2在resource2上获取lock2.然后Thread1try 获取lock2,而Thread2try 获取lock1,这会导致死锁.
根据this,我希望看到Thread2和Thread1的状态是BLOCKED,但当我用thread.getState()
监视状态时,它们无限期地处于WAITING状态.
你能告诉我为什么吗?
考虑一下锁在主类中声明为:
Lock lock1 = new ReentrantLock();
Lock lock2 = new ReentrantLock();
这是ThreadClass
的代码
import java.util.concurrent.locks.Lock;
public class ThreadClass extends Thread {
private Lock lock1;
private Lock lock2;
private Resource resource1;
private Resource resource2;
public ThreadClass(Resource resource1, Resource resource2, String name, Lock lock1, Lock lock2) {
this.resource1 = resource1;
this.resource2 = resource2;
this.lock1 = lock1;
this.lock2 = lock2;
this.setName(name);
}
@Override
public void run() {
if (Thread.currentThread().getName().equals("Thread1")) {
lock1.lock();
System.out.println(Thread.currentThread().getName() + ": Using " + resource1.name);
// Simulating work on RESOURCE 1
lock2.lock();
System.out.println(Thread.currentThread().getName() + ": Using " + resource2.name);
// Simulating work on RESOURCE 2
lock2.unlock();
lock1.unlock();
}
if (Thread.currentThread().getName().equals("Thread2")) {
lock2.lock();
// Simulating work on RESOURCE 2
lock1.lock();
System.out.println(Thread.currentThread().getName() + ": Using resource1");
lock1.unlock();
lock2.unlock();
}
}
}