前言:想要了解死锁和避免死锁,我们就需要知道死锁大概是怎么样写的
public class MyThread extends Thread {
private final static Object lock1 = new Object();
private final static Object lock2 = new Object();
@Override
public void run() {
if ("a".equals(Thread.currentThread().getName())){
synchronized (lock1)
{
System.out.println("线程A获取了锁1,还想获取锁2");
synchronized (lock2)
{
System.out.println("线程A获取了锁1,也获取了锁2");
}
}
}
if ("b".equals(Thread.currentThread().getName())){
synchronized (lock2)
{
System.out.println("线程B获取了锁2,还想获取锁1");
synchronized (lock1)
{
System.out.println("线程b获取了锁2,也获取了锁1");
}
}
}
}
}
public class Main {
public static void main(String[] args) {
MyThread a = new MyThread();
a.setName("a");
MyThread b = new MyThread();
b.setName("b");
a.start();
b.start();
}
}
输出结果:
结论:线程A持有锁1,需要获取锁2才能释放锁1;线程B持有锁2,需要获取锁1才能释放锁2
这种情况下双方都获取不到需要的锁,就会造成死锁。