有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁,即线程持有锁,但是还要去争夺其它线程的锁。
    死锁可以简单理解为:“吃着碗里的,瞅着锅里的”

    t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁
    t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁

    例如:

    1. public class TestDeadLock {
    2. public static void main(String[] args) {
    3. }
    4. public static void test1(){
    5. Object A = new Object();
    6. Object B = new Object();
    7. Thread t1 = new Thread(()->{
    8. synchronized (A){
    9. System.out.println("Lock A");
    10. try {
    11. Thread.sleep(1000);
    12. } catch (InterruptedException e) {
    13. e.printStackTrace();
    14. }
    15. synchronized (B){
    16. System.out.println("Lock B");
    17. System.out.println("操作....");
    18. }
    19. }
    20. },"t1");
    21. Thread t2 = new Thread(()->{
    22. synchronized (B){
    23. System.out.println("Lock B");
    24. try {
    25. Thread.sleep(500);
    26. } catch (InterruptedException e) {
    27. e.printStackTrace();
    28. }
    29. synchronized (A){
    30. System.out.println("lock A");
    31. System.out.println("操作....");
    32. }
    33. }
    34. },"t2");
    35. t1.start();
    36. t2.start();
    37. }
    38. }

    线程t1和t2并发执行,t1获得A对象的锁,t2获得B对象的锁,t1执行到synchronized(B)时由于锁被t2占有而阻塞住,t2执行到synchronize(A)时由于锁被t1占有而阻塞住,线程同时阻塞住,陷入死锁状态。