这是我学习java并发编程做的笔记,附上原课程B站地址:全面深入学习java并发编程,中级程序员进阶必会
1.简单的死锁程序
以下代码会导致一个死锁: t1线程锁住A对象后申请B对象的锁,t2线程锁住B对象后申请A对象锁,产生矛盾,导致死锁。
将此代码运行,然后下一步
/**
*死锁的演示与排查
*
* */
@Slf4j(topic = "c.Test2")
public class Test2 {
private static final Object A = new Object();
private static final Object B = new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (A){
log.debug("锁住A...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B){
log.debug("锁住B...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t1").start();
new Thread(()->{
synchronized (B){
log.debug("锁住B...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (A){
log.debug("锁住A...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t2").start();
}
}
2.打开Terminal,输入jps
点击打开terminal工具,输入jps,查看进程id
3.找到对应线程,输入jstack 对应id
如下:
4.查看打印的信息
下图的意思就是,t2锁住了f98的一个对象,需要一个f88的
下图的意思就是,t1锁住了f88的一个对象,需要一个f98的,综合上面的图,就知道俩兄弟意见不合,各要对方的资源,然后就尬住了,即死锁。
当然,懒得分析上面独立的信息也可以往下滑
底下直接就帮你分析好了
以上就是所有啦,告辞我继续滚去学习了。