JVM(三)--jstack实战死循环与死锁

(一)1、demo

package com.gisquest.zrzy.platform.client.frmdept;

import com.gisquest.realestate.vo.ResponseBodyVo;
import com.gisquest.realestate.vo.ResponseStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Description : jstack实战死循环与死锁
 * @Auth : Xuhy
 * @Date : 2019-01-23
 * @Time : 09:45
 */
@Controller
public class DemoCtrl {

    private Object lock1 = new Object();
    private Object lock2 = new Object();


    /**
     * 死锁
     * PS:Thread1中想要获取的locak2已经被 Thread2占有了
     *    Thread2中想要获取的locak1已经被 Thread1占有了
     *
     * @param
     * @return
     * @date 2019-01-23 09:04
     */
    @GetMapping("/deadlock")
    public
    @ResponseBody
    ResponseBodyVo<String> read() {
        new Thread(() -> {
            synchronized (lock1) {
                try {Thread.sleep(1000);} catch (Exception e) {}
                synchronized (lock2){
                    System.out.println("Thread1 over");
                }
            }
        }).start();
        new Thread(() -> {
            synchronized (lock2) {
                try {Thread.sleep(1000);} catch (Exception e) {}
                synchronized (lock1){
                    System.out.println("Thread2 over");
                }
            }
        }).start();
        return  new ResponseBodyVo<>(ResponseStatus.OK,"deadlock");
    }
}

2、返回结果

{
    "status": 200,
    "msg": "deadlock",
    "code": "0"
}

PS:结果能正常返回,里面只是启动了两个子线程,不影响主线程“deadlock"的返回!

那这个问题我们如何利用jstack进行定位?

(二)1、查看进程ID

ps -ef  | grep java

2、返回结果

JVM(三)--jstack实战死循环与死锁

3、下载JVM详细信息

jstack 23674 > 23674.txt
sz 23674.txt

4、文件详情

JVM(三)--jstack实战死循环与死锁