首先我们先写一个死锁程序
public class DeadLock {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (A.class){
System.out.println(Thread.currentThread().getName()+"持有了A类锁");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B.class){
System.out.println(Thread.currentThread().getName()+"持有了B类锁");
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (B.class){
System.out.println(Thread.currentThread().getName()+"持有了B锁");
synchronized (A.class){ System.out.println(Thread.currentThread().getName()+"持有了A锁");}
}
}
}).start();
}
}
class A{}
class B{}
代码思路:先用线程1去获得A类锁然后线程2获得B类锁,此时再去执行线程1去获得B类锁,发现无法获得,跳到线程2去获得A类锁也无法获得。形成死锁循环
程序无法终止
我们打开java 安装地址打开bin目录
打开后
有一个死锁 点开:
我们发现绿色箭头是752cea90对象也就是我们线程1想要获得对象,而线程0占有
红色箭头是7a4556dd对象是我们目前占有的
看看线程0的刚好和线程1的相反,形成死锁。