手写一个死锁的例子,然后排查是否死锁
package 修改文件内容;
class res {
public static void add(String lockA, String lockB) throws InterruptedException {
synchronized (lockA) {
Thread.sleep(2000);
System.out.println("已经拥有锁:" + lockA);
System.out.println("尝试获取锁:" + lockB);
synchronized (lockB) {
System.out.println("获得锁:" + lockB);
System.out.println("================================");
}
}
}
}
public class sisuo {
public static void main(String[] args) {
// TODO Auto-generated method stub
res r = new res();
String lockA = "lockA";
String lockB = "lockB";
new Thread() {
public void run() {
try {
r.add(lockA, lockB);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
new Thread() {
public void run() {
try {
r.add(lockB, lockA);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
/*
如何查看线程是否死锁了:
- 通过jps 在类路径下查看这个类所运行的线程的ID
- 通过jstack 线程号 查看是否死锁*/