import java.util.concurrent.TimeUnit;
/**
* @author Jing
* @date 2020/10/6 0006 17:37
*/
public class DieLockDemo {
public static void main(String[] args) {
String a = "a";
String b = "b";
Source2 source2 = new Source2(a, b);
Source2 source21 = new Source2(b, a);
// new Thread(new Runnable() {
// @Override
// public void run() {
// try {
// source2.run();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// try {
// source21.run();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }).start();
new Thread(new Source1(a,b)).start();
new Thread(new Source1(b,a)).start();
}
}
class Source1 implements Runnable{
String LockA;
String LockB;
public Source1(String lockA, String lockB) {
LockA = lockA;
LockB = lockB;
}
public void run(){
synchronized (LockA){
System.out.println("我拿到了"+LockA);
synchronized (LockB){
System.out.println("我想要"+LockB);
}
}
}
}
class Source2 {
String LockA;
String LockB;
public Source2(String lockA, String lockB) {
LockA = lockA;
LockB = lockB;
}
public void run() throws InterruptedException {
synchronized (LockA){
System.out.println("我拿到了"+LockA);
TimeUnit.SECONDS.sleep(1);
synchronized (LockB){
System.out.println("我想要"+LockB);
}
}
}
}
死锁检测:
通过jsp-l命令找到后台的java进程,这里并不能看出哪个是死锁的进程,需要记住每一个或者你认为有死锁的进程的编号。
jstack+进程编号 然后会发现有一个deadlock就说明这有个死锁。