一.java线程死锁是一个经典的多线程问题,因为不同的线程在等待不可能被释放的锁,从而导致所有任务都无法继续完成。多线程技术中,“死锁”是必须避免的。
二.模拟死锁案例:
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-14 上午9:52:54
* 类说明
*/
public class DeathThread 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 (Exception 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 (Exception e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("按lock2->lock1代码顺序执行了");
}
}
}
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-11 下午3:02:47
* 类说明
*/
public class Run {
public static void main(String[] args) throws InterruptedException {
try {
DeathThread d=new DeathThread();
d.setFlag("a");
Thread t1=new Thread(d);
t1.start();
Thread.sleep(100);//等待t1进入run中a分支
d.setFlag("b");
Thread t2=new Thread(d);
t2.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:本案例使用嵌套的代码结构来实现死锁,其实不使用嵌套代码也是会有可能出现死锁的。