有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁,即线程持有锁,但是还要去争夺其它线程的锁。
死锁可以简单理解为:“吃着碗里的,瞅着锅里的”
t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁
t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁
例如:
public class TestDeadLock {
public static void main(String[] args) {
}
public static void test1(){
Object A = new Object();
Object B = new Object();
Thread t1 = new Thread(()->{
synchronized (A){
System.out.println("Lock A");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B){
System.out.println("Lock B");
System.out.println("操作....");
}
}
},"t1");
Thread t2 = new Thread(()->{
synchronized (B){
System.out.println("Lock B");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (A){
System.out.println("lock A");
System.out.println("操作....");
}
}
},"t2");
t1.start();
t2.start();
}
}
线程t1和t2并发执行,t1获得A对象的锁,t2获得B对象的锁,t1执行到synchronized(B)时由于锁被t2占有而阻塞住,t2执行到synchronize(A)时由于锁被t1占有而阻塞住,线程同时阻塞住,陷入死锁状态。