线程死锁

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值