死锁概念
A持有B,B持有A,互相等待对方释放锁,而阻塞任务
怎么防止死锁
(1)加锁顺序
线程按照一定的顺序加锁
(2)加锁时限
线程获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁
4 产生死锁的例子```java
/**
* 死锁案例
*
* @author gaorimao
* @since 2021-12-10
*/
public class DeadLock implements Runnable {
public int flag = 1;
//静态对象是类的所有对象共享的
private static Object o1 = new Object();
private static Object o2 = new Object();
@Override
public void run() {
System.out.println("flag=" + flag);
if (flag == 1) {
// 锁1
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 锁2
synchronized (o2) {
System.out.println("1");
}
}
}
if (flag == 0) {
// 锁2
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 锁1
synchronized (o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
// 线程1,锁1,持有锁2
DeadLock td1 = new DeadLock();
td1.flag = 1;
new Thread(td1).start();
// 线程2,锁2,持有锁1
DeadLock td2 = new DeadLock();
td2.flag = 0;
new Thread(td2).start();
}
}
怎么定位死锁
(1)jps命令找出死锁类的PID
cmd下输入jps
(2)再使用 jstack + pid
查看日志