立即学习:https://edu.csdn.net/course/play/26270/326861?utm_source=blogtoedu
线程死锁
指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
死锁产生的四个必要条件:
- 1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
- 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
- 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
- 4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
处理死锁
1.预防死锁
通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个。此方法较易实现,已被广泛使用,但会降低系统资源利用率。
2.避免死锁
在资源的动态分配过程中,使用某种方法去防止系统进入不安全状态。
3.死锁检测并解除
通过系统所设置的检测机构,可以及时发现与死锁有关的进程和资源,然后将进程从死锁状态中解脱出来,常用的措施是撤销或挂起一些进程(剥夺),以便回收某些资源,再将这些资源分配给已处于阻塞状态的进程,使之变为就绪态,使之继续运行,此方法实施难度比较大。
定位死锁问题
·jps:例举正在运行的饿虚拟机进程并显示虚拟机的主类以及这些进程的唯一ID(PID)
·jstack:用于JVM当前时刻的线程快照,得到JVM当前每一条线程正在执行的堆栈信息,定位线程长时间卡顿问题。
数据库的死锁