死锁产生的原因:【1】系统资源不足;【2】资源分配不当;【3】进程运行推进的顺序不合适
    形成死锁的四个必要条件:
    【1】互斥条件:一个资源每次只能被一个进程使用。
    【2】请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
    【3】不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
    【4】循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    Java线程状态:NEW、RUNABLE、 BLOCKED(被锁阻塞)、WAITING、TIMED_WATING(超时等待)、TERMINATED。

    ps aux|grep xxx 找到进程的PID
    Java程序死锁定位与解决 - 图1
    jstack pid 可以看到线程正在做什么。可以看到死锁
    Java程序死锁定位与解决 - 图2


    避免死锁的方法:
    固定加锁的顺序(针对锁顺序死锁);
    开放调用(针对对象之间协作造成的死锁);
    使用定时锁 tryLock();使用显式 Lock锁,在获取锁时使用 tryLock()方法。当等待超过时限的时候,tryLock()不会一直等待,而是返回错误信息。使用tryLock()能够有效避免死锁问题。