死锁再探
死锁再探
之前学了死锁产生的条件,两个线程分别抱着一个对象的锁,还想同时去获取另一个对象的锁,便会引发死锁
死锁示例
package juc;
import java.util.concurrent.TimeUnit;
public class TestDeadLock {
public static void main(String[] args) {
String lockA = new String();
String lockB = new String();
new Thread(new DeadLock(lockA, lockB),"T1").start();
new Thread(new DeadLock(lockB, lockA),"T2").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() {
System.out.println(Thread.currentThread().getName()+"get lockA and lockB");
synchronized (lockA){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println("program logic");
}
}
}
}
调试与定位
实在理解不了可以看视频,讲解的是比较清楚的
在IDEA里面左侧最下面有一个Terminal窗口,如果程序有死锁情况,在程序运行中状态,在Terminal窗口中输入一下命令可定位问题... 命令很多,需要持续学习与运用
命令与功能
# 查询当前运行中的java进程 例当前程序进程号为16636
jps -l
# 查询该进程的堆栈信息
jstack 16636
# 查看内存快照
jmap 16636
# jhat和jmap配合, 可以解析jmap生成的堆快照, 支持生成1个web进程供分析查看
# 查看进程中内存使用情况
# 统计加载了多少类以及占用空间
jstat -class 16636
#统计编译了多少文件
jstat -compiler 16636