死锁的定义
线程死锁就是有两个线程,一个线程锁住了资源A,又想去锁定资源B,另外一个线程锁定了资源B,又想锁定资源A。两个线程都想去得到对方的资源,而不愿意释放自己的资源,从而造成一种相互等待,无法执行的情况。
定位分析:
查看服务器的CPU、内存、IO、网络情况:命令:dstat -tcmnd –dist-util
用Jvisualvm
工具进行查看,JVM是非常平稳的
查看tomcat的进程,然后使用jstack查看对应的进程ID,打印堆栈信息。
Ps -ef | grep tomcat jstact 8086 > test.log
线程阻塞的定义
在多线程情况下,如果一个线程对拥有某个资源的锁,那么这个线程就可以运行资源相关的代码。而其他线程就只能等待其执行完毕后,才能继续争夺资源锁,从而运行相关代码。当多个用户同时操作的时候,就会导致商品超出库存售卖,这个就设计到多线程模式下的数据安全问题。关于这个场景其实在工作中是非常多的,如优惠券领取,最后一个优惠券库存的时候,多个用户同时领取,是否会出现都领取成功的情况。解决方案
出现上方这种情况下,通常我们都需要通知开发进行加锁。在多线程的情况下,如果存在修改共享数据的操作,就需要对操作步骤进行加锁,拥有锁的线程才可以执行相关代码。没有锁的线程只能等待其释放后,才有资格执行代码。但是大家现在思考一下,加锁之后是不是就存在了一定的性能问题,加锁之后,只有锁内部的线程才能执行业务操作,其他的线程都处于等待的状态,这样就会导致出现性能瓶颈。但是这个通常都需要根据业务来决定,在某些业务上安全性高于性能。 标签:加锁,查看,阻塞,死锁,线程,多线程,资源 From: https://www.cnblogs.com/yongheng999/p/17966481