死锁-疫情之间的死锁问题(理想化)

背景
  • 疫情下,出行需要健康码。
  • 计划明天就要出门去其他地方。今天打算买票。
任务
  • 买票:疫情之下携程买不了汽车票,只能去汽车站买了。
  • 申请通行码:出行需要通行码,出入各种场合。
事情经过

提前一天买票,在网上找车票习惯性的打开携程,发现还没有车票,就开始在微信公众号上找本地的汽车站公众号。查询到了确实有一班车可以出发。但是没有找到购票的选项,想着那就去汽车站买吧。
既然买不了票, 我就先申请健康码吧,打开申请健康码的界面,一路填下去,填到这个地方,蒙了。在这里插入图片描述
仔细看,在最下面的交通工具选项里,有个选项让填写车次和座次号。
噫,我没有买票哎,没法填。好吧这个也完不成了。
突然想到,我没健康码哎,进不了汽车站啊。
这段时间,一直在复习Java,突然就蹦出来了死锁问题。

  • 我没有健康码,进不了汽车站买票。
  • 进不了汽车站买票,我申请不了出行健康码。

其实现实中这种问题是很容易解决的。

  • 车站没有健康出行码其实也可以进入的,只要申请本地健康码就可以进入本地的场所,然后在进去买票,然后在申请外地健康码。(先申请小的资源,再申请大的资源)
  • 微信是可以买票的。只是我一开始没有找到入口,后来找到了,但是问题还是在脑海里。
问题建模
  • 首先是有一个主体,表示行为的执行者(类)。也就是问题中的我本人。
  • 然后是主体应该有的属性(变量):主体是谁,是否拥有健康码、是否拥有票。
    public class People {
    private String Name; //用来标识用户名称
    private boolean Ticket ;//用来标识用户是否拥有车票
    private boolean HealthCertificate ;//用来标识用户是否用于健康出行码
    
    /**
     * 使用名称构造实体,初始都没有票和出行码
     * @param Name
     */
    public  People(String Name){
        this.Name = Name;
        this.Ticket = false;
        this.HealthCertificate = false;
    }
    
    public String getName() {
        return Name;
    }
    
    public void setName(String name) {
        Name = name;
    }
    
    public boolean isTicket() {
        return Ticket;
    }
    
    public void setTicket(boolean ticket) {
        Ticket = ticket;
    }
    
    public boolean isHealthCertificate() {
        return HealthCertificate;
    }
    
    public void setHealthCertificate(boolean healthCertificate) {
        HealthCertificate = healthCertificate;
    }
    
    @Override
    public String toString() {
        return "People{" +
                "Name='" + Name + '\'' +
                ", Ticket=" + Ticket +
                ", HealthCertificate=" + HealthCertificate +
                '}';
    }
    

}
```

  • 然后是有两个供行为执行的场所(资源所在地,需要访问的类):汽车站(买票的地方)、健康服务站(申请健康码的地方)
  • 然后是主体的行为(方法):买票、申请健康码
	public class Hospital {

    public void checkPeople(People people){
        if(!people.isTicket()){
            System.out.println("对不起你没有车票,不能给你发放健康出行码");
        }
        if(people.isTicket()) {
            receivePeople(people);
        }
    }

    private void receivePeople(People people){
        people.setHealthCertificate(true);
        System.out.println(people.getName()+"申请到了健康出行码");
    }
}
	public class Station {
    public void checkPeople(People people){
        if(!people.isHealthCertificate()){
            System.out.println("对不起,你没有健康码,不可以进入车站");
        }
        if(people.isHealthCertificate()){
            people.setTicket(true);
            System.out.println(people.getName()+"买到了车票");
        }
    }
}
  • 最后进行测试
public class Test {
    public static void main(String[] args) {
        People hcf = new People("小飞");

        System.out.println(hcf);
    }
}

进行到这里,所有的实体,方法。创建完成。
但是出现了问题,我不知道如何把死锁跟这个程序联系起来。好尴尬。。
还是自己的能力不够,我还是先继续学习,等有了思路在来解决这个问题。
不过问题应该是处在了我只是把问题实体建模了,现在的问题根本就没有和线程扯上关系。
在对问题建模时,应该把车票和出行码模拟成资源。然后people的实体在申请两个资源时出现死锁,前置条件不满足,后置条件没法进行。
这个证明了我在建模还有编程方面的知识积累不足以支撑我继续进行。或者是我的思维陷入了。。。
我会在后续的学习中,对这个问题进行思考和反思。

如果有大神路过,欢迎指点,谢谢。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值