线程1在拥有a这把锁的同时申请b这把锁,此时线程2拥有b这把锁同时申请a这把锁,两个线程都拿不到第二个锁,无法执行,产生死锁,一直等待第二把锁,线程一直无法结束,就产生了死锁。
现实生产中的死锁复杂的多,但原理大致相同
public class Test4 {
public synchronized void m1(){
try{
TimeUnit.SECONDS.sleep(2);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" m1");
}
public static void main(String args[]){
Test4 t=new Test4();
Test41 t2=new Test41();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (t){
t.m1();
t2.m2();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (t2){
t2.m2();
t.m1();
}
}
}).start();
}
}
class Test41{
public synchronized void m2(){
try{
TimeUnit.SECONDS.sleep(2);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" m2");
}
}