死锁 :
死锁 互相持有对方的锁,互相等待对方释放锁,然后一直等下去,这个就是死锁。
比如:
两个线程 s1 s2互相获取o1,o2锁 让其睡眠 4s 然后在互相获取对方的锁,这时候 o1,o2已经被s1,s2所占用,此时处于等待所释放,然后就一直等下去。产生死锁
public class DeadLock {
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
new Thread("s1"){
@Override
public void run() {
synchronized (o1){
System.out.println(" s1 get o1");
try {
Thread.sleep(4_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println(" s1 get o1");
}
}
}
}.start();
new Thread("s2"){
@Override
public void run() {
synchronized (o2){
System.out.println(" s2 get o2");
try {
Thread.sleep(4_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println(" s2 get o1");
}
}
}
}.start();
}
}
有时候,出现死锁情况我们无法定位问题,这时候我们可以使用jdk自带的一些工具
如jps查看进程id
jps
可以看到 DeadLock 和这个类在运行当中
然后再根据进程id查看 堆栈信息
jstack + 空格 + 进程id
jstack 5604
可以看到一些信息 found deadlock 发现一个死锁
两个线程 s1 s2
互相在等待对方的释放锁
互相拿到了o1,o2对象的锁