死锁的概念:
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉,那他们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因为争夺有限的资源而陷入死锁
下面是我写的一个死锁的Demo
public class DeadLockTest {
private static final String lockA ="lockA";
private static final String lockB ="lockB";
public static void main(String[] args) {
new Thread(new DeadLock(lockA,lockB),"线程A").start();
new Thread(new DeadLock(lockB,lockA),"线程B").start();
}
}
class DeadLock implements Runnable{
private String lockA;
private String lockB;
public DeadLock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"\t获的了"+lockA+"锁,还在尝试获取"+lockB);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"\t获取了"+lockB+"锁.....");
}
}
}
}
运行结果:
线程A 获的了lockA锁,还在尝试获取lockB
线程B 获的了lockB锁,还在尝试获取lockA
出现了死锁了:
出现死锁的定位方法:
- jps 来定位是那个进程,可以查到进程号
- jstack 进程号---这个命令来定位是错在了什么地方