看到论坛中神贴也很多,我也来分享下我的经验,探讨多线程死锁使用ThreadDump查看死锁,这是本人的经验之谈,把技术放在硬盘里还不如拿出来共同研究,如果觉得有帮助就顶下!
在多线程程序中,线程死锁是一件很令人头疼的事情,有的时候程序挂了,不知道哪的bug,在多线程程序中如果能很快判断出线程死锁,就可以快速的修正bug。
线程死锁产生的原因是:锁嵌套,最简单的是A锁嵌套B锁,B锁嵌套A锁,所以尽量不要使用同步嵌套这样会很危险。- public class TestDeadLock {
- public static Object lockA = new Object();
- public static Object lockB = new Object();
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- ThreadA a = new ThreadA();
- ThreadB b = new ThreadB();
-
- a.start();
- b.start();
- }
- }
- class ThreadA extends Thread{
-
- public void run(){
- System.out.println("** Enter ThreadA **");
- synchronized (TestDeadLock.lockA) {
- System.out.println("** Enter ThreadA **: Lock A" );
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- //attemp to lock B
- synchronized(TestDeadLock.lockB){
- System.out.println("** Enter ThreadA **: Lock B" );
- }
- }
- }
- }
- class ThreadB extends Thread{
-
- public void run(){
- System.out.println("** Enter ThreadB **");
- synchronized (TestDeadLock.lockB) {
- System.out.println("** Enter ThreadB **: Lock B" );
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- //attemp to lock A
- synchronized(TestDeadLock.lockA){
- System.out.println("** Enter ThreadA **: Lock A" );
- }
- }
- }
- }
复制代码
Windos:ctrl+break Linux :kill -3 pid(进程号) 以下是windos下得输出结果 TreadDump的作用 1、通过TreadDump的输出信息可以判断死锁 2、对java程序进行调优 可以在一分钟内做 5~6次TreadDump 如果一个线程一直都是RUNNABLE或者BLOCKED这个线程就有可能出现问题
|