死锁定义
- 两个线程都在等待对方先完成,造成程序的停滞。
死锁条件
- 两个或两个以上的线程在活动;
- 某个线程拿到一个锁以后,还想拿第二个锁,造成锁的嵌套;
如何避免死锁
- 当前线程先释放自己的锁,它们之间就能解锁了。
- 尽量减少同步方法和同步代码块的嵌套,同步的操作越多,越容易产生死锁。
死锁举例:
此时,两个小朋友陷入了僵持状态,就好比有两个线程,它们各自有自己的锁,又都想拿到对方的锁,但是又不想放开自己的锁。🔒
/** * 模拟死锁 * @Hudie */
public class DeadLock {
public static void main(String[] args) {
Object bobby = new Object();// 两个线程共同操作同一份资源
Object duck = new Object();// 两个线程共同操作同一份资源
Thread tangtang = new Thread(new Tangtang(bobby, duck));
Thread doudou = new Thread(new Doudou(bobby, duck));
tangtang.start();
doudou.start();
}
}
class Tangtang implements Runnable {
Object bobby;// 芭比
Object duck;// 玩具鸭
public Tangtang(Object bobby, Object duck) {
super();
this.bobby = bobby;
this.duck = duck;
}
@Override
public void run() {
synchronized (duck) {// 各自持有自己的一把锁
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (bobby) {// 各自又想获得对方的锁
}
System.out.println("糖糖愿意把芭比给豆豆玩!");
}
}
}
class Doudou implements Runnable {
Object bobby;// 芭比
Object duck;// 玩具鸭
public Doudou(Object bobby, Object duck) {
super();
this.bobby = bobby;
this.duck = duck;
}
@Override
public void run() {
synchronized (bobby) {// 各自持有自己的一把锁
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (duck) {// 各自又想获得对方的锁
}
System.out.println("豆豆就把玩具鸭给糖糖玩!");
}
}
}
代码运行,什么也不会发生