线程死锁及解决方案
2019-03-15 本文已影响0人
泽林呗
发生死锁的原因一般是两个对象的锁相互等待造成的。
学过操作系统的朋友都知道:产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
所以,简单来说,就是一个线程持有一个锁,另一个线程持有另一个锁。两个线程同时申请获取对方的锁,导致相互都阻塞在那里,谁也不愿意释放锁,导致死锁。
public class TryDieSock implements Runnable {
private int flag = 1;
static Object obj1 = new Object(), obj2 = new Object();
@Override
public void run() {
if (flag == 1) {
synchronized (obj1) {
System.out.println("锁定了obj1,过0.5秒后去锁定obj2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (obj2) {
System.out.println("锁定了obj2,过0.5秒后去锁定obj1");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println(0);
}
}
}
}
public static void main(String[] args) {
TryDieSock try1 = new TryDieSock();
TryDieSock try2 = new TryDieSock();
try1.flag = 1;
try2.flag = 0;
Thread thread1 = new Thread(try1);
Thread thread2 = new Thread(try2);
thread1.start();
thread2.start();
}
}
因为object1和object2加上了static关键字,是共享资源,会造成死锁
解决死锁的办法,只要破坏上面的其中一条就可以了