Java最简单的死锁例子
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
简单来说:
线程1和线程2的执行逻辑中都需要锁定对象A和对象B。
线程1在执行中先锁定了A对象。
线程2在执行中锁定了B对象。
线程1需要锁定B对象时发现B对象已经被其他线程锁住,所以线程1需要等待B对象锁释放后继续执行。
线程2需要锁定A对象时发现A对象已经被其他线程锁住,所以线程2需要等待A对象锁释放后继续执行。
这样就产生了死锁现象,以下图展示了死锁:
简单代码实现:
package com.btt.test;
public class DeadLock {
private Object A = new Object();
private Object B = new Object();
public void run() {
System.out.println("开始执行线程");
}
public Object getA() {
return A;
}
public void setA(Object a) {
A = a;
}
public Object getB() {
return B;
}
public void setB(Object b) {
B = b;
}
public static void main(String[] args) {
final DeadLock dl1 = new DeadLock();
Runnable r1 = new Runnable() {
public void run() {
synchronized (dl1.getA()) {
String tName = Thread.currentThread().getName();
System.out.println("我是线程" + tName + ",我拿到了A对象的锁");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我需要拿B对象的锁啦");
synchronized (dl1.getB()) {
System.out.println("线程1开始跑了");
}
};
}
};
Runnable r2 = new Runnable() {
public void run() {
synchronized (dl1.getB()) {
String tName = Thread.currentThread().getName();
System.out.println("我是线程" + tName + ",我拿到了B对象的锁");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我需要拿A对象的锁啦");
synchronized (dl1.getA()) {
System.out.println("线程2开始跑了");
};
};
}
};
Thread t1 = new Thread(r1);
t1.setName("t1");
t1.start();
Thread t2 = new Thread(r2);
t2.setName("t2");
t2.start();
}
}
打印台输出结果:
我是线程t1,我拿到了A对象的锁
我是线程t2,我拿到了B对象的锁
我需要拿A对象的锁啦
我需要拿B对象的锁啦
还没有评论,来说两句吧...