Java模拟实现机场过安检处理流程

 更新时间:2022年04月22日 09:33:43   作者:chengqiuming  
这篇文章主要为大家详细介绍了用Java模拟实现机场安全检查流程的案例,涉及线程的相关知识,由子线程不断的检查通过旅客,感兴趣的小伙伴们可以参考一下

一 场景描述

乘飞机时,在进入登机口之前必须经过安全检查,安检口类似于独木桥,每次只能通过一个人,工作人员除了检查你的登机牌外,还有一些其它检查。在此模拟一个非线程安全的安检口类,旅客(线程)分别手持登机牌和身份证接受工作人员的检查。

二 实战

1 FlightSecurity

package concurrent.FlightSecurity;
public class FlightSecurity {
    private int count;
    // 登机牌
    private String boardingPass = "null";
    // 身份证
    private String idCard = "null";
    public void pass(String boardingPass,String idCard){
        this.boardingPass = boardingPass;
        this.idCard = idCard;
        this.count++;
        check();
    }
    private void check() {
        // 简单测试,当登机牌和身份证首字母不相同时则表示检查不通过
        if(boardingPass.charAt(0)!=idCard.charAt(0)){
            throw new RuntimeException("======Excepton======"+toString());
        }
    }
    public String toString(){
        return "The " +count +" paaaenges,boardingPass [" + boardingPass + "],idCard [" + idCard +"]";
    }
}

2 FightSecurityTest

package concurrent.FlightSecurity;
public class FightSecurityTest {
    // 旅客线程
    static class Passengers extends Thread{
        // 机场安检类
        private final FlightSecurity fightSecurity;
        // 旅客的身份证
        private final String idCard;
        // 旅客登机牌
        private final String boardingPass;
        Passengers(FlightSecurity fightSecurity, String idCard, String boardingPass) {
            this.fightSecurity = fightSecurity;
            this.idCard = idCard;
            this.boardingPass = boardingPass;
        }
        @Override
        public void run() {
            while(true){
                // 旅客不断地过安检
                fightSecurity.pass(boardingPass,idCard);
            }
        }
    }
    public static void main(String[] args) {
        // 定义三个旅客,身份证和登机牌首字母相同
        final FlightSecurity flightSecurity= new FlightSecurity();
        new Passengers(flightSecurity,"A","A").start();
        new Passengers(flightSecurity,"B","B").start();
        new Passengers(flightSecurity,"C","C").start();
    }
}

三 测试

1 测试结果1

Exception in thread "Thread-1" Exception in thread "Thread-0" java.lang.RuntimeException: ======Excepton======The 356 paaaenges,boardingPass [B],idCard [A]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)
java.lang.RuntimeException: ======Excepton======The 356 paaaenges,boardingPass [B],idCard [A]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)

2 测试结果2

Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.RuntimeException: ======Excepton======The 953 paaaenges,boardingPass [C],idCard [C]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)
java.lang.RuntimeException: ======Excepton======The 1039 paaaenges,boardingPass [C],idCard [C]
    at concurrent.FlightSecurity.FlightSecurity.check(FlightSecurity.java:20)
    at concurrent.FlightSecurity.FlightSecurity.pass(FlightSecurity.java:14)
    at concurrent.FlightSecurity.FightSecurityTest$Passengers.run(FightSecurityTest.java:24)

四 问题分析

在多线程情况下调用 pass 方法,虽然参数的传递百分百保证就是这两个值,但是在 pass 方法中对这两个值的赋值很有可能交叉,不能保证原子性操作。

解决的方法是给 pass 方法加上 synchronized 关键字。

public synchronized void pass(String boardingPass,String idCard)

五 说明

在 Java 中经常会听到线程安全的类和线程非安全的类,所谓线程安全的类是指多个线程同时进行操作时,不会引起数据不一致问题,反之则是线程非安全的类,在线程安全的类中经常会看到 synchronized 关键字的身影。

到此这篇关于Java模拟实现机场过安检处理流程的文章就介绍到这了,更多相关Java 机场安检内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • SpringBoot中使用Swagger的最全方法详解

    SpringBoot中使用Swagger的最全方法详解

    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的Web服务,这篇文章主要给大家介绍了关于SpringBoot中使用Swagger的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 详解MySQL的简易封装以及使用

    详解MySQL的简易封装以及使用

    本文主要介绍了MySQL的简易封装以及使用。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java Annotation Overview详解

    Java Annotation Overview详解

    这篇文章主要介绍了Java Annotation Overview,需要的朋友可以参考下
    2014-02-02
  • SpringBoot+MinIO实现文件上传、读取、下载、删除的使用示例

    SpringBoot+MinIO实现文件上传、读取、下载、删除的使用示例

    本文主要介绍了SpringBoot+MinIO实现文件上传、读取、下载、删除的使用示例,详细介绍每个功能实现的步骤和代码示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • java图片对比度调整示例代码

    java图片对比度调整示例代码

    这篇文章主要给大家介绍了关于java图片对比度调整的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 详解springcloud之服务注册与发现

    详解springcloud之服务注册与发现

    本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明,非常具有实用价值,需要的朋友可以参考下
    2018-06-06
  • Java中Math.round()的用法及说明

    Java中Math.round()的用法及说明

    这篇文章主要介绍了Java中Math.round()的用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Java中使用JavaMail多发邮件及邮件的验证和附件实现

    Java中使用JavaMail多发邮件及邮件的验证和附件实现

    这篇文章主要介绍了Java中使用Java Mail多发邮件及邮件的验证和附件实现,包括在邮件中加入图片等功能的实现讲解,需要的朋友可以参考下
    2016-02-02
  • 浅谈springboot 属性定义

    浅谈springboot 属性定义

    本篇文章主要介绍了浅谈springboot 属性定义,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 详解使用Spring Security进行自动登录验证

    详解使用Spring Security进行自动登录验证

    本篇文章主要介绍了详解使用Spring Security进行自动登录验证,非常具有实用价值,需要的朋友可以参考下
    2017-09-09

最新评论