死锁定义、造成死锁的原因不多说了,操作系统里的那套理论知识罢了。
写一个死锁的demo:
public class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName() + "\t 持有锁" + lockA +"\t 下面尝试获得" + lockB);
synchronized (lockB){
System.out.println(Thread.currentThread().getName() + "\t 持有锁" + lockB);
}
}
}
/**
* 写一个死锁的demo:
* 两个线程互相尝试去获取对方所拥有的锁
* @param args
*/
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "Thread 1").start(); //小tips:new Thread()构造函数中只能放Runnable,不能放Callable,除非使用FutureTask构造方法进行封装成Runnable
new Thread(new HoldLockThread(lockB, lockA), "Thread 2").start();
}
}
windows中如何检测到死锁产生了?
在IDEA terminal或者cmd 的当前项目路径下输入 jps -l 查出在运行的Java进程(linux中是 ps -ef|grep java)
并输入 jstack ${进程号} 查看栈中报错信息