1 . 死锁: 两个线程之间 , 必须有两个不同的锁
两个线程互相拿着对象的锁不释放, 还想要对象手里的锁
2 . 条件:
两个线程
两个不同的锁
每个线程都必须用着这两把锁
3 . 在写代码的过程中,尽量避免死锁
package com.qf.demo2;
import java.awt.Color;
/**
*/
public class Test {
public static void main(String[] args) {
Ni ni = new Ni();
Girl girl = new Girl();
ni.start();
girl.start();
}
}
class Ni extends Thread{
@Override
public void run() {
synchronized (Clock.A) {
System.out.println("你拿到了筷子A,还想要筷子B");
synchronized (Clock.B) {
System.out.println("你也拿到了筷子B , 吃 , 吃完以后 恢复单身狗");
}
}
}
}
class Girl extends Thread{
@Override
public void run() {
synchronized (Clock.B) {
System.out.println("女朋友拿到了筷子B, 还想要筷子A");
synchronized (Clock.A) {
System.out.println("女朋友也拿到了A, 吃, 吃完以后回家睡觉");
}
}
}
}
class Clock{
public static final Object A = new Object();
public static final Object B = new Object();
}
在上面的代码中,如果运行结果:
女朋友拿到了筷子B, 还想要筷子A
女朋友也拿到了A, 吃, 吃完以后回家睡觉
你拿到了筷子A,还想要筷子B
你也拿到了筷子B , 吃 , 吃完以后 恢复单身狗
这种情况是一个线程占用cpu以后执行完毕,然后让给了另一个线程.
但是如果ni线程占用了A锁,girl对象占用了B锁,这时ni线程需要B锁,girl线程需要A锁,但是各自的锁是释放不了的,所以就造成了死锁.
例如下面的输出就是死锁时的输出:
女朋友拿到了筷子B, 还想要筷子A
你拿到了筷子A,还想要筷子B