Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这会造成线程“假死”。
测试代码:
package test;
/**
* @Author LiBinquan
*/
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 ("A".equals(userName)){
synchronized (lock1){
try {
System.out.println("userName = " + userName);
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (lock2){
System.out.println("按lock2 -> lock1 代码顺序执行了");
}
}
}
if ("B".equals(userName)){
synchronized (lock2) {
try{
System.out.println("userName = "+userName);
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (lock1){
System.out.println("按lock2 -> lock1 代码顺序执行了");
}
}
}
}
}
运行类:
package test;
/**
* @Author LiBinquan
*/
public class Run {
public static void main(String[] args) throws InterruptedException {
DealThread t1 = new DealThread();
t1.setFlag("A");
Thread thread1 = new Thread(t1);
thread1.start();
Thread.sleep(100);
t1.setFlag("B");
Thread thread2 = new Thread(t1);
thread2.start();
}
}
运行结果:
我这边使用JDK的安装目录里 执行jsp命令
得到运行的线程Run的id值是90966.在执行jstack命令,查看结果。
监测出有死锁现象。
死锁是线程涉及的BUG,在设计程序时就要避免双方互相持有对方的锁的情况。需要说明的是,本实验使用synchronized嵌套的代码结构来实现死锁,其实不使用嵌套的代码结构也会出现死锁,与嵌套不嵌套无任何的关系,不要被代码结构所误导。只要相互等待对方释放锁就有可能出现死锁。