文章目录
- 1、什么是死锁
- 2、产生死锁的原因
- 3、死锁演示
- 4、验证是否是死锁
1、什么是死锁
两个或两个以上进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,它们无法再执行下去。
2、产生死锁的原因
3、死锁演示
import java.util.concurrent.TimeUnit;
public class DeadLock {static Object a = new Object();static Object b = new Object();public static void main(String[] args) {new Thread(()->{synchronized (a) {System.out.println(Thread.currentThread().getName()+" 持有锁a,试图获取锁b");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (b) {System.out.println(Thread.currentThread().getName()+" 获取锁b");}}},"A").start();new Thread(()->{synchronized (b) {System.out.println(Thread.currentThread().getName()+" 持有锁b,试图获取锁a");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (a) {System.out.println(Thread.currentThread().getName()+" 获取锁a");}}},"B").start();}
}
4、验证是否是死锁
可以使用jps命令查看进程,再用jvm自带的堆栈跟踪工具jstack查看
可以看到需要验证的进程id为10840
然后执行命令jstack 10840
可以看到 B持有锁b 试图获取锁a
A持有锁a,试图获取锁b