面试中被问到用java实现死锁的案例,在这里记录一下
- Thread1首先抢夺resource1锁,然后执行耗时操作(Thread.sleep),紧接着抢夺resource2锁
- Thread2首先抢夺resource2锁,然后执行耗时操作(Thread.sleep),紧接着抢夺resource1锁
由于执行sleep函数时,线程休眠了,但是它不会主动释放锁,所以休眠的这段时间thread2抢到了resource2的锁,这样两者互相等待对方放锁,就形成了死锁。
public class DeadLock {
private static Integer resource1 = 1 ;
private static Integer resource2 = 2 ;
static class Thread1 implements Runnable{
@Override
public void run() {
synchronized (resource1){
try {
System.out.println(getClass().getName()+" obtains the lock of resource1!");
Thread.sleep(500);
synchronized (resource2) {
System.out.println(getClass().getName()+" obtains the lock of resource2!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Thread2 implements Runnable{
@Override
public void run() {
synchronized (resource2){
try {
System.out.println(getClass().getName()+" obtains the lock of resource2!");
Thread.sleep(500);
synchronized (resource1) {
System.out.println(getClass().getName()+" obtains the lock of resource1!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
}
}
运行结果
可以发现没有哪个线程能拿到第二个锁。