package com.study.train;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.yield;
public class Main extends Thread{
private Object o1;
private Object o2;
Main(Object oa,Object ob,String name) {
super(name);
o1 = oa;
o2 = ob;
}
@Override
public void run() {
synchronized (o1) {
System.out.println("thread: "+Thread.currentThread().getName() + " get lock");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("two lock is get");
}
}
}
public static void main(String[] args) throws InterruptedException {
Object oj1 = new Object();
Object oj2 = new Object();
Main m1 = new Main(oj1,oj2,"thread1");
Main m2 = new Main(oj2,oj1,"thread2");
m1.start();
m2.start();
m1.join();
m2.join();
}
}

linux上可以先使用top | grep java,查找忙的线程pid,然后拿到该线程id进行分析,jstakc pid。