死锁再探

死锁再探

之前学了死锁产生的条件,两个线程分别抱着一个对象的锁,还想同时去获取另一个对象的锁,便会引发死锁

死锁示例

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

posted @ 2021-12-27 12:00  Oh,mydream!  阅读(21)  评论(0编辑  收藏  举报