1. 死锁的基本概念
多个线程彼此持有对方所需要的锁(或资源),而不释放自己已经持有的锁,导致这些线程永远都不能获取到锁或资源而处于永远阻塞的状态
导致死锁的原因 1. 由于某些条件不成立,导致线程之间无法进行正常的同步操作 2. 循环等待,形成一个环路,比如a等待b,b等待c,c等待d,d等待a 死锁产生的必要条件 1. 只有两个或两个以上的线程才会产生死锁 2. 参与死锁的线程至少有2个已经占有共享资源
public class deadLock extends Thread {
private String name;
private long sleep = 3000;
private long holdsLockSleep = 1000;
public deadLock(String name){
super(name);
this.name = name;
}
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public void deadLockRun(){
try{
if(this.name.equals("a线程")){
synchronized (lock1){
System.out.println(Thread.currentThread().getName()+"获得lock1锁");
Thread.sleep(sleep);
this.haveLock(lock2);
//由于条件不满足,导致a线程永远阻塞,无法释放lock1锁
synchronized (lock2){
System.out.println(Thread.currentThread().getName()+"获得lock2锁");
}
}
}
if(this.name.equals("b线程")){
synchronized (lock2){
System.out.println(Thread.currentThread().getName()+"获得lock2锁");
Thread.sleep(sleep);
this.haveLock(lock1);
//由于条件不满足,导致b线程永远阻塞,无法释放lock2锁
synchronized (lock1){
System.out.println(Thread.currentThread().getName()+"获得lock1锁");
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 检测当前线程是否得到锁
* @param lock
*/
public void haveLock(Object lock){
String threadName = Thread.currentThread().getName();
try{
while (!Thread.holdsLock(lock)){
if(threadName.equals("a线程")){
System.out.println("是否获得lock2锁:"+Thread.holdsLock(lock2));
}
if(threadName.equals("b线程")){
System.out.println("是否获得lock1锁:"+Thread.holdsLock(lock1));
}
Thread.sleep(holdsLockSleep);
}
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run(){
deadLockRun();
}
public static void main(String [] args){
Thread t1 = new deadLock("a线程");
Thread t2 = new deadLock("b线程");
t1.start();
t2.start();
}
}