死锁

   在众多的应用程序中,使用锁的情况一般要多于无锁。因为对于应用来说,如果业务逻辑很复杂,会极大增加无锁的编程难度。但如果使用锁,我们就不得不对一个新的问题引起重视——那就是死锁。
    
  那什么是死锁呢?通俗的说,死锁就是两个或者多个线程,相互占用对方需要的资源,而都不进行释放,导致彼此之间都相互等待对方释放资源,产生了无限制等待的现象。死锁一旦发生,如果没有外力介入,这种等待将永远存在,从而对程序产生严重的影响。 
 
 如果在实际环境中,遇到了这种情况,通常的表现就是相关的进程不再工作,并且CPU占用率为0(因为死锁的线程不占用CPU),不过这种表面现象只能用来猜测问题。如果想要确认问题,还需要使用JDK提供的一套专业工具。
    
    首先,我们可以使用jps命令得到java进程的进程ID,接着使用jstack命令得到线程的线程堆栈
 
避免死锁的方式:
    1.使用无锁的函数
    2.使用重入锁,通过重入锁的中断或者限时等待可以有效规避死锁带来的问题 
原文地址:https://www.cnblogs.com/756623607-zhang/p/6965314.html