1、创建死锁
package lao.ben.juc.deadLock;
import org.junit.Test;
//死锁条件:两个线程互相持有对方想要的锁,对方又释放不了,就卡住了。
public class DeadLock {
//方法一
String xiaowang = "xiaownag";
String xiaohong = "xiaohong";
public void together1() throws Exception {
synchronized (xiaowang) {
//线程安全问题就是线程之间打了个时间差。
//业务代码执行时间越长,越容易产生线程安全问题。
Thread.sleep(100);
synchronized (xiaohong) {
System.out.println("together1执行了");
}
}
}
public void together2() throws Exception {
synchronized (xiaohong) {
Thread.sleep(100);
synchronized (xiaowang) {
System.out.println("together2执行了");
}
}
}
}
2、创建线程任务类
package lao.ben.juc.deadLock;
public class Thread1 extends Thread {
private DeadLock deadLock;
public Thread1(DeadLock dl) {
this.deadLock = dl;
}
public void run() {
try {
deadLock.together1();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package lao.ben.juc.deadLock;
public class Thread2 extends Thread {
private DeadLock deadLock;
public Thread2(DeadLock dl) {
this.deadLock = dl;
}
public void run() {
try {
deadLock.together2();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、测试结果
没有输出任何东西。
线程1在执行业务代码时,需要线程2的锁。
线程2在执行业务代码时,需要线程1的锁。
犟。
4、总结
在多线程环境中,一个线程不可避免的会获取多个锁。
为了避免死锁的情况,在使用锁时,一定要注意使用顺序,并减少同步嵌套同步的数量。
Lock接口中这个方法可以设置等待时间,避免两个线程犟劲上来了,你不让我,我不让你。