Java模擬實現(xià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)斷言及過濾器案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑
這篇文章主要介紹了詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10教你用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著如何使用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06Springboot中使用Redisson+AOP+自定義注解實現(xiàn)訪問限流與黑名單攔截
本文主要介紹了Springboot中使用Redisson+AOP+自定義注解實現(xiàn)訪問限流與黑名單攔截,包含針對用戶IP限流,整個接口的訪問限流,以及對某個參數(shù)字段的限流,并且支持請求限流后處理回調(diào),感興趣的可以了解一下2024-02-02