什么是死锁?
假如在程序运行中,线程a获得了对象锁,并在执行程序时,线程a需要再取得另外一个对象锁才能继续进行程序的执行,但此时对象a的所需的对象锁被另一个线程(b)获得,而b线程需要a线程手中的对象锁,那么此时二者就形成了 死锁 ,两个线程都会同时处于饥饿状态,等待对面释放出对象锁,导致线程无法进行执行
简易死锁代码:
package deadlock;
public class DealLock {
public static void main(String[] args) {
DealLock dealLock = new DealLock();
dealLock.DoIt();
}
public void DoIt() {
Dl l = new Dl();
//新建两个线程,分别为线程1线程2
Thread t1 = new Thread(l, "线程1");
Thread t2 = new Thread(l, "线程2");
t1.start();
t2.start();
}
//实现线程接口:
public class Dl implements Runnable {
boolean flag = true;//用于判断线程状态
private Object a = new Object();
private Object b = new Object();
@Override
public void run() {
if (flag) {
flag = false;
synchronized (a) {
System.out.println(Thread.currentThread().getName() + "正在运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (b) {
System.out.println(Thread.currentThread().getName() + "正在运行");
}
}
} else {
flag = true;
synchronized (b) {
System.out.println(Thread.currentThread().getName() + "正在运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (a) {
System.out.println(Thread.currentThread().getName() + "正在运行");
}
}
}
}
}
}
死锁如何进行避免?
死锁的产生大多是由于程序的设计层级考虑不完善导致的,产生的原因来自于当前线程对于对象锁无法进行获取。因此需要考虑清除每个对象锁的优先级顺序,在释放时,必须优先考虑较高优先级的对象锁。