什么是死锁?
在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让程序重新执行。
造成死锁的原因:
- 当前线程拥有其他线程需要的资源
- 当前线程等待其他线程已拥有的资源
- 都不放弃自己拥有的资源
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);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName() + "\t持有:"+lockB + "\t尝试获得" + lockA);
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA,lockB),"AAA").start();
new Thread(new HoldLockThread(lockB,lockA),"BBB").start();
}
}
那么怎么判断是死锁,为什么不是死循环
/**
* linux ps -ef|grep xxxx
* windows下的java程序 也有类似ps的查看进程的命令,但是目前我们需要查看的只是java
* jps = java ps jps -l
*/
在命令行下输入jps -l
,查看到当前的JUC.DeadLockDemo进程号10440
然后用jstack 10440来查看
很长就不全部截图了,最后有个Found 1 deadlock