死锁编码及定位分析

一、死锁

死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。

死锁编码及定位分析_第1张图片

二、死锁代码案例

import java.util.concurrent.TimeUnit;

public class HoldLockThreadTest {
    public static void main(String[] args) {
        //调用实现了Runnable接口的类
        String lock001 = "lock001";
        String lock002 = "lock002";
        new Thread(new HoldLockThread(lock001,lock002),"001").start();
        new Thread(new HoldLockThread(lock002,lock001),"002").start();
    }
}

class HoldLockThread implements Runnable{
    private  String lock001;
    private  String lock002;

    public HoldLockThread(String lock001,String locak002){
        this.lock001 = lock001;
        this.lock002 = locak002;
    }

    @Override
    public void run() {
        synchronized (lock001){
            System.out.println("线程"+Thread.currentThread().getName()+"\t 自己持有锁"+lock001+"\t 尝试获取锁"+lock002);
            try {//休眠5秒,为了演示死锁效果
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock002){
                System.out.println("线程"+Thread.currentThread().getName()+"\t 自己持有锁"+lock002+"\t 尝试获取锁"+lock001);
            }
        }
    }
}

执行结果:一直未执行完毕

死锁编码及定位分析_第2张图片

三、死锁的定位

Linux下使用 ps -ef | grep java

window下的Java运行程序:jps -l

死锁编码及定位分析_第3张图片

1、输入jps -l命令定位进程号

死锁编码及定位分析_第4张图片

2、输入jstack 进程号找到死锁报告

死锁编码及定位分析_第5张图片

你可能感兴趣的:(Java实践,Java面试及基础概念,java,servlet,jvm)