使用BTrace检查死锁
程序员文章站
2022-04-19 14:00:18
...
产生死锁的代码:
package neicun; public class DeadLockTest { static class SynAddRunnable implements Runnable { private Object a, b; public SynAddRunnable(Object a, Object b) { this.a = a; this.b = b; } @Override public void run() { synchronized (a) { try { Thread.currentThread().sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (b) { System.out.println(a.toString() + " " + b.toString()); } } } } public static void main(String[] args) { String a = new String("a"); String b = new String("b"); new Thread(new SynAddRunnable(a, b)).start(); new Thread(new SynAddRunnable(b, a)).start(); } }
打开jvisualvm,右击选中的java进程,选中->Trace application
在打开的窗口里面输入以下代码:
/* BTrace Script Template */ import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class TracingScript { /* put your code here */ @OnTimer(4000) public static void print(){ deadlocks(); } }
上面代码的依旧就是每4秒钟检查以下死锁,dealdlocks方法是BTrace工具提供的静态方法,输出的结果如下:
从结果可知在代码22行处,因为Thread-0需要持有的锁已经被Thread-1所持有,而同样的Thread-1需要持有的锁已经被Thread-0锁持有。
上一篇: (转)MySQL 锁问题最佳实践
下一篇: 浅谈加速度传感器及其在计步器中的应用