首页 > 编程知识 正文

进程死锁和线程死锁,mysql死锁排查

时间:2023-05-06 12:21:38 阅读:111324 作者:4837

多线程编程中总是会遇到死锁,但发生死锁时,不会报告错误,也不会提示错误。 在这种情况下,您必须学习在线程出现死锁时进行故障排除。

什么是死锁:

死锁是两个或多个进程在运行过程中因冲突资源或相互通信而被阻塞的现象,必须有外力作用才能推进。 此时,这些永远互相等待的过程被称为死锁过程,即系统处于死锁状态或系统发生死锁。 百度百科:死锁。

在我个人的认知中,死锁是指两个以上的线程,即使彼此拥有对方需要使用的锁也无法释放,所以大家无法前进,只能无限等待。

死锁故障排除:

首先写死锁的例子:

Task1.class :

package cn.mxl.task; import Java.util.concurrent.locks.reentrant lock; 公共类任务1 { privatereentrantlocklock1=newreentrantlock (; privatereentrantlocklock2=newreentrantlock (; publictask1(reentrantlocklock1,ReentrantLock lock2) {this.lock1=lock1; this.lock2=lock2; }public void deadThrea () (while ) true ) ) {lock1.lock ); System.out.println ('第一层lock' Thread.currentThread () ).getName ); lock2.lock (; System.out.println ('第二层lock' Thread.currentThread ().getName ) ); lock2.unlock (; lock1.unlock (; }}} Task2.class:

package cn.mxl.task; import Java.util.concurrent.locks.reentrant lock; 公共类任务2 { privatereentrantlocklock1=newreentrantlock (; privatereentrantlocklock2=newreentrantlock (; publictask2(reentrantlocklock1,ReentrantLock lock2) {this.lock1=lock1; this.lock2=lock2; }public void deadThrea () (while ) true ) ) {lock2.lock ); System.out.println ('第一层lock' Thread.currentThread () ).getName ); lock1.lock (; System.out.println ('第二层lock' Thread.currentThread ().getName ) ); lock1.unlock (; lock2.unlock (; }}} MyThread1.class:

package cn.mxl.task; public class my thread1implements runnable { task1task; publicmythread1(task1task ) ) {this.task=task; }公共void run ()//todo auto-generatedmethodstubtask.dead threa ); }} MyThread2.class:

package cn.mxl.task; public class my thread2implements runnable { task2task; publicmythread2(task2task ) {this.task=task; }公共void run ()//todo auto-generatedmethodstubtask.dead threa ); }} Run.class:

package cn.mxl.task; import Java.util.concurrent.locks.reentrant lock; public class run {/* * * @ param args */publicstaticvoidmain (string [ ] args (//todo auto-generatedmethodstubreentrance task1task1=newtask1(lock1,lock2); task2task2=newtask2(lock1,lock2); mythread1m1=newmythread1(task1); mythread2m2=newmythread2(task2); threadT1=newthread(M1; threadT2=newthread(M2; t1.start (; t2.start (; }运行结果:

开始诊断线程死锁故障:

使用jps jstack :

第一,在windons命令窗口中使用jps -l (小写l )。

第二:检查端口:jstack -l 16456

执行结果:

说明了发生死锁现象

第三方:使用JConsole:

然后找到了死锁位置:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。