有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁,即线程持有锁,但是还要去争夺其它线程的锁。
死锁可以简单理解为:“吃着碗里的,瞅着锅里的”
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占有而阻塞住,线程同时阻塞住,陷入死锁状态。
