一个死锁例子:
package com.duoxiancheng;
public class DeadLock {
private static void deadLockExample(){
final Object o1=new Object();
final Object o2=new Object();
Runnable r1=()->{
synchronized(o1){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("R1 Done!");
}
}
};
Runnable r2=()->{
synchronized(o2){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("R2 Done!");
}
}
};
new Thread(r1,"Thread1").start();
new Thread(r2,"Thread2").start();
}
public static void main(String[] args) {
deadLockExample();
}
}
运行如下:
先 jps 找到程序进程pid,再用 :jstack 进程pid
程序堆栈信息如下:
如上图所示,Thread1和Thread2 进入了BLOCKED,产生了死锁.
那么如何解决死锁?
首先明白死锁产生的四个条件:
这里演示一下,以固定顺序去获取锁:
package com.duoxiancheng;
public class DeadLock {
private static final Object obj1=new Object();
private static final Object obj2=new Object();
private static void fixedOrderGetLock(){
System.out.println(Thread.currentThread().getName()+"get lock obj1 succedd!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj2){
System.out.println(Thread.currentThread().getName()+"get lock obj2 succedd!");
}
}
private static void hasNotDeadLockExample(){
Runnable r1=DeadLock::fixedOrderGetLock;
Runnable r2=DeadLock::fixedOrderGetLock;
new Thread(r1,"Thread1").start();
new Thread(r2,"Thread2").start();
}
public static void main(String[] args) {
hasNotDeadLockExample();
}
}
结果如下: