描述
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信造成的一种阻塞现象,若无外力作用,他们将无法推进下去。在多线程技术中,死锁是应当避免的,因为这会造成系统的假死。
死锁示例代码
package com.yf.Synchronized;
public class DealThread implements Runnable {
public String username;
public Object lock1 = new Object();
public Object lock2 = new Object();
public void setUsername(String username) {
this.username = username;
}
@Override
public void run() {
if ("a".equals(username)) {
synchronized (lock1) {
try {
System.out.println("username =" + username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("lock1->lock2代码顺序执行了");
}
}
}
if ("b".equals(username)) {
synchronized (lock2) {
try {
System.out.println("username =" + username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("lock2->lock1代码顺序执行了");
}
}
}
}
public static void main(String[] args) {
try {
DealThread thread = new DealThread();
thread.setUsername("a");
Thread t1 = new Thread(thread);
t1.start();
Thread.sleep(100);
thread.setUsername("b");
Thread t2 = new Thread(thread);
t2.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果
线上该如何排查死锁
- 首先进入cmd工具,执行jps命令。
- 找到当前应用的进程号 使用jstack -l "进程号" 来打印jstack日志。
- 分析日志确定是否发生死锁。