1.线程死锁是怎么产生的
两个或者两个以上的进程在执行的过程中,因争夺资源导致相互等待而产生的
2.死锁产生的因素
1.系统资源不足
2.资源分配不当
3.进程的运行推动的顺序不合适
3.手写一个线程死锁的demo
package com.company;
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println("线程名称:" + Thread.currentThread().getName() + "==>已拿到锁:" + lockA + "==>需要获取锁:" + lockB);
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println("线程名称:" + Thread.currentThread().getName() + "==>已拿到锁:" + lockB + "==>需要获取锁:" + lockA);
}
}
}
}
public class DeadLock {
public static void main(String[] args) {
// write your code here
var lockA = "lockA";
var lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "ThreadA").start();
new Thread(new HoldLockThread(lockB, lockA), "ThreadB").start();
}
}
4.死锁代码定位
1.定位进程id
cmd执行 jps -l
2.结果输出
11712 org.jetbrains.jps.cmdline.Launcher
1300
2196 jdk.jcmd/sun.tools.jps.Jps
1272 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
8776 com.company.DeadLock
3.发现id为8776进程是不是和我们的类包路径一致
4.执行jstack 8776
Found one Java-level deadlock:
=============================
"ThreadA":
waiting to lock monitor 0x00000254cf898f00 (object 0x000000071225dac0, a java.lang.String),
which is held by "ThreadB"
"ThreadB":
waiting to lock monitor 0x00000254cfbe4600 (object 0x000000071225da90, a java.lang.String),
which is held by "ThreadA"
Java stack information for the threads listed above:
===================================================
"ThreadA":
at com.company.HoldLockThread.run(DeadLock.java:22)
- waiting to lock <0x000000071225dac0> (a java.lang.String)
- locked <0x000000071225da90> (a java.lang.String)
at java.lang.Thread.run(java.base@11.0.8/Thread.java:834)
"ThreadB":
at com.company.HoldLockThread.run(DeadLock.java:22)
- waiting to lock <0x000000071225da90> (a java.lang.String)
- locked <0x000000071225dac0> (a java.lang.String)
at java.lang.Thread.run(java.base@11.0.8/Thread.java:834)
Found 1 deadlock.
5. 线程发生死锁的代码位置 com.company.HoldLockThread.run(DeadLock.java:22)
以上就是手写线程死锁和定位发生死锁位置的操作过程,如果解决的话修改代码逻辑方可