死锁再探
死锁再探
之前学了死锁产生的条件,两个线程分别抱着一个对象的锁,还想同时去获取另一个对象的锁,便会引发死锁
死锁示例
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
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号