造成死锁的原因:

    1. 互斥条件.
    2. 不可剥夺.
    3. 循环等待
    4. 占有且等待.

    1.互斥,共享资源 X 和 Y 只能被一个线程占用;
    2.占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;
    3.不可抢占,其他线程不能强行抢占线程 T1 占有的资源;
    4.循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。

    如何解决:
    1.第一点互斥是我们需要的,共享资源只能被一个线程占用.
    2.占有且等待.内部封装,一次申请完,全部释放.
    3.不可抢占,可以用Java中的lock解决.后面补充实例.
    3.破坏这个条件,需要对资源进行排序,然后按序申请资源