前言
Java多线程中死锁是一个重要内容,所以对于死锁的理解非常重要。在面试过程中,经常会让程序员写一个死锁案例。
一、什么是死锁
- 我们举一个生活中的例子,中国人和外国人一起吃饭,中国人使用筷子外国人使用叉子才能顺利吃完饭。
- 那么什么是死锁现象呢?就是外国人拿着筷子,中国人拿着叉子,两个人谁都不给谁,那么,就会一直僵持,谁都吃不了饭。
- 死锁现象出现后,不会出现异常,也不会出现提示,只是所有的线程都会出现阻塞状态,无法继续。
二、死锁案例
- 创建一个LockUtils接口
public interface LockUtils {
Object Obj1 = new Object();
Object Obj2 = new Object();
}
- 主程序
public class 死锁现象 implements LockUtils {
public static void main(String[] args) {
MyThread10 th1 = new MyThread10(true);
MyThread10 th2 = new MyThread10(false);
th1.start();
th2.start();
}
}
class MyThread10 extends Thread {
private boolean flag;
public MyThread10(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
//同步代码块嵌套
synchronized (LockUtils.Obj1) {
System.out.println("true线程持有obj1锁,进来了");
synchronized (LockUtils.Obj2) {
System.out.println("true线程持有obj2锁,进来了");
}
}
} else {
synchronized (LockUtils.Obj2) {
System.out.println("false线程持有obj2锁,进来了");
synchronized (LockUtils.Obj1) {
System.out.println("false线程持有obj1锁,进来了");
}
}
}
}
}
运行结果:
true线程拿了obj1锁,输出语句。false线程拿了obj2锁,输出语句。两个线程都在等待释放资源,并且该资源被另外一个线程锁定,导致每个线程都在等待对象线程释放其锁,从而产生死锁现象。