1.什么是死锁?如何产生
通俗的来说死锁就是两个或两个以上的进程由于竞争资源而导致阻塞,在没有外力的作用下,这种阻塞会一直持续下去。产生死锁有以下四大原因:
①互斥:一个资源同时只能被一个线程占用。②请求和保持:因为请求资源而阻塞的线程不会放弃自己已经拥有的资源。 ③不剥夺:阻塞的线程所拥有的资源不能被其他的线程强行剥夺。④循环等待:多个资源形成头尾相连,循环等待的关系。
2.具体的代码实现
下面程序是非常标准的写法,给一个线程方法传入两个不同的参数,再开启两个线程就会导致死锁。
public class DeadLock {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new MyThread(lockA,lockB),"T1").start();
new Thread(new MyThread(lockB,lockA),"T2").start();
}
}
class MyThread extends Thread{
private String lockA;
private String lockB;
public MyThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized(lockA){
System.out.println(Thread.currentThread().getName() + "lock:" + lockA + "=>get"+lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName() + "lock:" + lockB + "=>get"+lockA);
}
}
}
}
3.如何排查死锁?
①使用gps -l查看全部的进程,可以看到deadlock的进程号
②使用jstack可以查看此进程的堆栈信息
通过堆栈信息我们看出线程1拥有资源94530同时等待944f8,线程二拥有944f8等待94530,造成死锁。