死锁java
Java 线程是死锁是一个经典的多线程问题,由于不一样的线程都在等待根本不可能被释放的锁,从而致使全部的任务都没法继续完成多线程
DealThread.javaide
package dealThread.demo; public class DealThread implements Runnable{ public String username; public Object lock1 = new Object(); public Object lock2 = new Object(); public void setFlag(String username){ this.username = username; } @Override public void run(){ if(username.equals("a")){ synchronized (lock1){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock2){ System.out.println("lock1 -> lock2"); } } } if(username.equals("b")){ synchronized (lock2){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock1){ System.out.println("lock2 -> lock1"); } } } } }
Run.java工具
package dealThread.demo; public class Run { public static void main(String[] args){ try{ DealThread t1 = new DealThread(); t1.setFlag("a"); Thread thread1 = new Thread(t1); thread1.start(); Thread.sleep(1000); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); }catch(InterruptedException e){ e.printStackTrace(); } } }
运行结果以下:this
线程thread1和thread2都持有对方的锁,并且须要等待对方释放锁以后才能往下继续运行,这个时候就发生了死锁;其实不使用嵌套的synchronized代码结构也会出现死锁,与嵌套不嵌套没有任何关系,只要互相等待对方释放锁就有可能出现死锁。spa
进入JDK的安装目录中的bin目录,执行jps命令:线程
能够看出获得运行的线程Run的id值为7404,再执行jstack命令,查看结果:code