欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java模擬實現(xiàn)機場過安檢處理流程

 更新時間:2022年04月22日 09:33:43   作者:chengqiuming  
這篇文章主要為大家詳細介紹了用Java模擬實現(xiàn)機場安全檢查流程的案例,涉及線程的相關(guān)知識,由子線程不斷的檢查通過旅客,感興趣的小伙伴們可以參考一下

一 場景描述

乘飛機時,在進入登機口之前必須經(jīng)過安全檢查,安檢口類似于獨木橋,每次只能通過一個人,工作人員除了檢查你的登機牌外,還有一些其它檢查。在此模擬一個非線程安全的安檢口類,旅客(線程)分別手持登機牌和身份證接受工作人員的檢查。

二 實戰(zhàn)

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() {
        // 簡單測試,當?shù)菣C牌和身份證首字母不相同時則表示檢查不通過
        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 測試結(jié)果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 測試結(jié)果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)

四 問題分析

在多線程情況下調(diào)用 pass 方法,雖然參數(shù)的傳遞百分百保證就是這兩個值,但是在 pass 方法中對這兩個值的賦值很有可能交叉,不能保證原子性操作。

解決的方法是給 pass 方法加上 synchronized 關(guān)鍵字。

public synchronized void pass(String boardingPass,String idCard)

五 說明

在 Java 中經(jīng)常會聽到線程安全的類和線程非安全的類,所謂線程安全的類是指多個線程同時進行操作時,不會引起數(shù)據(jù)不一致問題,反之則是線程非安全的類,在線程安全的類中經(jīng)常會看到 synchronized 關(guān)鍵字的身影。

到此這篇關(guān)于Java模擬實現(xiàn)機場過安檢處理流程的文章就介紹到這了,更多相關(guān)Java 機場安檢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解

    Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解

    這篇文章主要介紹了Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑

    詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑

    這篇文章主要介紹了詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 教你用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法

    教你用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著如何使用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解Java中Collections.sort排序

    詳解Java中Collections.sort排序

    Comparator是個接口,可重寫compare()及equals()這兩個方法,接下來通過本文給大家介紹Java中Collections.sort排序,需要的的朋友參考下吧
    2017-04-04
  • Java Web實現(xiàn)自動登陸功能

    Java Web實現(xiàn)自動登陸功能

    這篇文章主要為大家詳細介紹了Java Web實現(xiàn)自動登陸功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 圖文詳解SpringBoot中Log日志的集成

    圖文詳解SpringBoot中Log日志的集成

    這篇文章主要給大家介紹了關(guān)于SpringBoot中Log日志的集成的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-12-12
  • Java編寫計算器的常見方法實例總結(jié)

    Java編寫計算器的常見方法實例總結(jié)

    這篇文章主要介紹了Java編寫計算器的常見方法,結(jié)合實例形式總結(jié)分析了Java實現(xiàn)計算器功能的常用方法,需要的朋友可以參考下
    2016-04-04
  • Springboot中使用Redisson+AOP+自定義注解實現(xiàn)訪問限流與黑名單攔截

    Springboot中使用Redisson+AOP+自定義注解實現(xiàn)訪問限流與黑名單攔截

    本文主要介紹了Springboot中使用Redisson+AOP+自定義注解實現(xiàn)訪問限流與黑名單攔截,包含針對用戶IP限流,整個接口的訪問限流,以及對某個參數(shù)字段的限流,并且支持請求限流后處理回調(diào),感興趣的可以了解一下
    2024-02-02
  • Java函數(shù)式編程(十一):遍歷目錄

    Java函數(shù)式編程(十一):遍歷目錄

    這篇文章主要介紹了Java函數(shù)式編程(十一):遍歷目錄,本文是系列文章的第11篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • Java實現(xiàn)ArrayList自動擴容

    Java實現(xiàn)ArrayList自動擴容

    ArrayList的擴容規(guī)則是非常簡單的,它會根據(jù)需要自動擴容,本文就來介紹一下Java實現(xiàn)ArrayList自動擴容,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12

最新評論