造成死锁的原因可以简单概括为:当前线程拥有其他线程需要的资源,当前线程等待其他线程已拥有的资源,都不放弃自己拥有的资源。而避免死锁的方式一般有以下方案:1.固定加锁的顺序,比如我们可以使用Hash值的大小来确定加锁的先后。就比如现在有一个转账场景,然后处理转账的方法的参数有from方,to方,还有金额amount,然后里面的加锁情况的先加锁from,再去加to的这样一个两层锁,然后里面去处理具体的业务。那么如果这个时候A向B转账,B也向A转账,那么可能就会导致A线程拿到A资源,B线程拿到B资源,就会造成死锁,然后用hash来解决的话呢,就是不要去先加from方再加to方,而是求出from和to各种的hash值,如果hash小就先加哪个,这样就可以使得线程A和线程B加锁的方向是一致的,不会造成死锁。2.尽可能缩减加锁的范围,等到操作共享的时候才加锁。3.使用可释放的定时锁,就如果一段时间申请不到锁,就直接释放掉。