关于线程死锁
导致死锁的原因
(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();
}
}
原文:https://www.cnblogs.com/xiaoquan66/p/15086045.html