死锁案例演示
原创
©著作权归作者所有:来自51CTO博客作者别团等shy哥发育的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 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