模拟死锁案例

我们来模拟一个死锁的案例

现在有张三想要李四的画,李四想要张三的书。

张三对李四说了:“你给我画,我就把书给你”。
李四也对张三说了:“你给我书,我就把画给你”。
此时,张三在等着李四的答复,而李四也在等着张三的答复,那么这样下去的最终结果就是张三得不到李四的画,李四也得不到张三的书。这实际上就是死锁的概念。

张三类

package com.thread;

/**
 * @author 邓亚非
 */
public class ZhanSan {
    /**
     * 张三问李思要画
     */
    public void say(){
        System.out.println("张三对李思说:你把画给我,我就把书给你");
    }

    /**
     * 张三得到李思的画
     */
    public void get(){
        System.out.println("张三得到了李思的画");
    }
}

李思类

package com.thread;

/**
 * @author 邓亚非
 */
public class LiSi {

    /**
     * 李思问张三要书
     */
    public void say(){
        System.out.println("李四对张三说,你把书给我,我就把画给你");
    }

    /**
     * 李思得到张三得书
     */
    public void get(){
        System.out.println("李思得到了张三的书");
    }
}

书画类线程体类

package com.thread;

/**
 * @author 邓亚非
 */
public class BookHua extends Thread {

    private static ZhanSan zhanSan=new ZhanSan();
    private static LiSi liSi =new LiSi();
    public boolean flag=false;

    @Override
    public void run() {
//        true张三先说
        if (flag){
          synchronized (zhanSan) {
              zhanSan.say();
              try {
                  Thread.sleep(500);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              synchronized (liSi) {
                  zhanSan.get();
              }
          }
        }else {
//            李思开口
           synchronized (liSi){
               liSi.say();
               try {
                   Thread.sleep(500);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               synchronized (zhanSan){
                   liSi.get();
               }
           }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值