第七十篇 從餐廳后廚到電影院選座:生活場景拆解Java并發編程核心

目錄

    • 一、并發基礎:餐廳后廚的協作藝術
      • 1.1 廚師與線程(Thread)
      • 1.2 共享資源競爭:唯一的炒鍋
      • 1.3 線程狀態轉換:廚師工作流
    • 二、線程同步:電影院選座中的鎖機制
      • 2.1 同步鎖(synchronized):選座系統
      • 2.2 顯式鎖(ReentrantLock):VIP選座通道
    • 三、線程協作:咖啡廳的點單取餐系統
      • 3.1 生產者-消費者模式
      • 3.2 CountDownLatch:旅行團集合點
    • 四、并發工具進階:超市收銀系統
      • 4.1 線程池(ExecutorService):收銀通道管理
      • 4.2 ConcurrentHashMap:實時庫存系統
    • 五、避坑指南:并發編程常見陷阱
      • 5.1 死鎖場景:十字路口的四輛車
      • 5.2 線程饑餓:永遠輪不到的普通會員
      • 5.3 內存可見性:過期的餐廳菜單
    • 六、性能優化:電影院排片策略
      • 6.1 鎖粒度控制
      • 6.2 無鎖編程:原子類操作
    • 結語:構建高效并發系統

想象一家繁忙的餐廳后廚:主廚指揮多個廚師同時處理訂單,服務員在取餐口等待出菜,新訂單不斷涌入——這正是Java并發編程的完美生活映射。本文將用你熟悉的日常場景,帶你掌握高并發系統的構建之道。

一、并發基礎:餐廳后廚的協作藝術

1.1 廚師與線程(Thread)

每個廚師就像一個線程

// 廚師線程類
class ChefThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "開始烹飪");// 模擬烹飪耗時try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }}
}// 啟動5個廚師線程
public static void main(String[] args) {for (int i=1; i<=5; i++) {new ChefThread().start();}
}

1.2 共享資源競爭:唯一的炒鍋

當多個廚師爭搶**同一個炒鍋(共享資源)**時:

// 共享炒鍋資源
class Wok {private boolean inUse = false;// 加鎖使用炒鍋public synchronized void use(String chefName) {if(inUse) return;inUse = true;System.out.println(chefName + "占用炒鍋");}
}

1.3 線程狀態轉換:廚師工作流

線程狀態廚師狀態觸發條件
RUNNABLE正在切菜獲取到食材
BLOCKED等待炒鍋其他廚師占用炒鍋
WAITING等待服務員傳菜菜品完成但服務員未就位
TIMED_WAITING定時查看烤箱設置定時器監控烘焙進度

二、線程同步:電影院選座中的鎖機制

2.1 同步鎖(synchronized):選座系統

場景:多人同時在線選座,避免座位重復出售

class Cinema {private boolean[] seats = new boolean[100]; // 100個座位// 同步選座方法public synchronized boolean bookSeat(int seatNo) {if(!seats[seatNo]) {seats[seatNo] = true;System.out.println(Thread.currentThread().getName() + "成功預訂座位" + seatNo);return true;}return false;}
}

2.2 顯式鎖(ReentrantLock):VIP選座通道

場景:提供超時等待功能,避免無限期阻塞

private ReentrantLock lock = new ReentrantLock();public boolean vipBookSeat(int seatNo) {try {// 嘗試在1秒內獲取鎖if(lock.tryLock(1, TimeUnit.SECONDS)) {if(!seats[seatNo]) {seats[seatNo] = true;return true;}}} catch (InterruptedException e) {e.printStackTrace();} finally {if(lock.isHeldByCurrentThread()) {lock.unlock();}}return false;
}

三、線程協作:咖啡廳的點單取餐系統

3.1 生產者-消費者模式

場景:顧客(生產者)下單,咖啡師(消費者)制作

BlockingQueue<Order> orderQueue = new ArrayBlockingQueue<>(10);// 顧客下單
class Customer implements Runnable {public void run() {orderQueue.put(new Order()); // 隊列滿時阻塞}
}// 咖啡師制作
class Barista implements Runnable {public void run() {while(true) {Order order = orderQueue.take(); // 隊列空時阻塞makeCoffee(order);}}
}

3.2 CountDownLatch:旅行團集合點

場景:導游等待所有游客到齊才發車

CountDownLatch latch = new CountDownLatch(10); // 10人旅行團// 游客線程
class Tourist extends Thread {public void run() {System.out.println(getName() + "到達集合點");latch.countDown();}
}// 導游線程
class Guide extends Thread {public void run() {latch.await(); // 等待所有游客System.out.println("所有游客到齊,發車!");}
}

四、并發工具進階:超市收銀系統

4.1 線程池(ExecutorService):收銀通道管理

// 開放4個收銀通道
ExecutorService cashiers = Executors.newFixedThreadPool(4); // 顧客排隊結賬
for(int i=0; i<20; i++) {cashiers.execute(() -> {System.out.println("顧客在"+Thread.currentThread().getName()+"結賬");});
}cashiers.shutdown(); // 營業結束關閉收銀臺

4.2 ConcurrentHashMap:實時庫存系統

ConcurrentHashMap<String, Integer> inventory = new ConcurrentHashMap<>();// 多個收銀臺同時更新庫存
inventory.compute("可樂", (k, v) -> v == null ? -1 : v-1);

五、避坑指南:并發編程常見陷阱

5.1 死鎖場景:十字路口的四輛車

條件:四個方向的車都等待對方先通行
解決方案:規定通行優先級(鎖排序)

5.2 線程饑餓:永遠輪不到的普通會員

現象:VIP會員總是優先辦理業務
修復:使用公平鎖(Fair Lock)

5.3 內存可見性:過期的餐廳菜單

// 錯誤示例:其他線程可能看不到menuChanged更新
boolean menuChanged = false; // 正確做法:使用volatile保證可見性
volatile boolean menuChanged = true;

六、性能優化:電影院排片策略

6.1 鎖粒度控制

// 粗粒度鎖:鎖整個影廳(性能差)
public synchronized void bookSeats(List<Integer> seats) {...}// 細粒度鎖:只鎖選定座位(推薦)
public void bookSeats(List<Integer> seats) {for (int seat : seats) {synchronized (seatLocks[seat]) {// 處理單個座位}}
}

6.2 無鎖編程:原子類操作

AtomicInteger availableTickets = new AtomicInteger(100);// 多個窗口同時售票
public boolean sellTicket() {int current = availableTickets.get();if(current > 0) {return availableTickets.compareAndSet(current, current-1);}return false;
}

結語:構建高效并發系統

Java并發編程如同管理繁忙的餐廳后廚:

  1. 合理分工:使用線程池控制工作線程數量
  2. 資源協調:通過鎖機制避免資源沖突
  3. 流程優化:利用阻塞隊列實現生產者-消費者模式
  4. 實時同步:采用原子操作保證數據一致性
新訂單
訂單隊列
線程池
廚師線程1
廚師線程2
廚師線程3
完成菜品
出餐口

掌握這些生活化的并發模式,你將能構建出如米其林餐廳后廚般高效運轉的Java應用系統。記住:優秀的并發程序不是沒有鎖,而是讓線程排隊時間最小化,協作效率最大化

🎯下期預告:《Java 線程池》
💬互動話題:第一要有志,第二要有識,第三要有恒
🏷?溫馨提示:我是[隨緣而動,隨遇而安], 一個喜歡用生活案例講技術的開發者。如果覺得有幫助,點贊關注不迷路🌟

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907857.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式學習--江協stm32day1

失蹤人口回歸了&#xff0c;stm32的學習比起51要慢一些&#xff0c;因為涉及插線&#xff0c;可能存在漏插&#xff0c;不牢固等問題。 相對于51直接對寄存器的設置&#xff0c;stm32因為是32位修改起來比較麻煩&#xff0c;江協課程是基于標準庫的&#xff0c;是對封裝函數進…

vue+elementUi+axios實現分頁(MyBatis、Servlet)

vueelementUiaxios實現分頁 文章目錄 vueelementUiaxios實現分頁1.代碼實現【HTML】**【Servlet層】****【Service層】****【Dao層】** 2.總結步驟3.實現要點4.注意事項4.注意事項 注&#xff1a;此項目 前端為 html、 后端采用 mybatis、servlet實現 1.代碼實現 【HTML】…

vue-10( 動態路由匹配和路由參數)

動態路由匹配和路由參數 動態路由匹配是 Vue Router 的一個強大功能&#xff0c;它允許你創建靈活且可重用的路由。您可以使用參數來捕獲 URL 的動態段&#xff0c;而不是為每個可能的值定義特定路由。這在處理具有唯一標識符的資源&#xff08;如用戶配置文件、產品詳細信息或…

劫持進程注入

劫持進程注入和遠程線程注入的區別就是 遠程線程注入是向一個正在運行中的進程注入 而劫持進程注入則是自己打開一個進程(以掛起的方式) 然后再進行注入的操作 這樣做的原因是當進程在掛起的狀態時他的所有線程都是處于未啟用的階段 這樣就可以避免目標進程的反注入線程的…

uni-app學習筆記二十--pages.json頁面路由pages設置

uni-app 通過 pages 節點配置應用由哪些頁面組成&#xff0c;pages 節點接收一個數組&#xff0c;數組每個項都是一個對象&#xff0c;其屬性值如下&#xff1a; 屬性類型默認值描述pathString配置頁面路徑styleObject配置頁面窗口表現&#xff0c;配置項參考下方 pageStylene…

VScode編譯調試debug,gpu的cuda程序,Nsight

進行下面操作的前提是&#xff0c;我們的環境已經能跑簡單的CUDA程序了。 一、安裝Nsight 二、創建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

鏈表題解——合并兩個有序鏈表【LeetCode】

1. 算法思路 這段代碼的核心思想是 合并兩個有序鏈表。具體步驟如下&#xff1a; 初始化哨兵節點&#xff1a; 創建一個哨兵節點 dummy&#xff0c;用于簡化鏈表操作&#xff0c;避免處理頭節點的特殊情況。使用指針 cur 指向 dummy&#xff0c;用于構建新的鏈表。 遍歷兩個鏈…

K8S集群主機網絡端口不通問題排查

一、環境&#xff1a; k8s: v1.23.6 docker: 20.10.14 問題和故障現象&#xff1a;devops主機集群主機節點到端口8082不通&#xff08;網絡策略已經申請&#xff0c;并且網絡策略已經實施完畢&#xff09;&#xff0c;而且網絡實施人員再次確認&#xff0c;網絡策…

qemu安裝risc-V 64

參考這篇文章https://developer.aliyun.com/article/1323996&#xff0c;其中在wsl下面安裝可能會報錯環境變量中有空格。 # clean_path.sh#!/bin/bash# 備份舊 PATH OLD_PATH"$PATH"# 過濾掉包含空格、制表符、換行的路徑 CLEAN_PATH"" IFS: read -ra PA…

python爬蟲:RoboBrowser 的詳細使用

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、RoboBrowser概述1.1 RoboBrowser 介紹1.2 安裝 RoboBrowser1.3 與類似工具比較二、基本用法2.1 創建瀏覽器對象并訪問網頁2.2 查找元素2.3 填寫和提交表單三、高級功能3.1 處理文件上傳3.2 處理JavaScript重定向3.3…

CTFSHOW-WEB-36D杯

給你shell 這道題對我這個新手還是有難度的&#xff0c;花了不少時間。首先f12看源碼&#xff0c;看到?view_source&#xff0c;點進去看源碼 <?php //Its no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "…

CentOS_7.9 2U物理服務器上部署系統簡易操作步驟

近期單位網站革新&#xff0c;鑒于安全加固&#xff0c;計劃將原有Windows環境更新到Linux-CentOS 7.9&#xff0c;這版本也沒的說&#xff08;絕&#xff09;了&#xff08;版&#xff09;官方停止更新&#xff0c;但無論如何還是被sisi的牽掛著這一大批人&#xff0c;畢竟從接…

LVS-DR高可用-Keepalived

目錄 Keepalved雙機熱備 核心概念 關鍵組件 工作流程 實例環境 配置keepalived Web服務器配置 Keepalved雙機熱備 Keepalived雙機熱備是一種基于VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虛擬路由冗余協議&#xff09;實現的高可用性解決方案&am…

Polar編譯碼(SCL譯碼)和LDPC編譯碼(BP譯碼)的matlab性能仿真,并對比香農限

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1香農極限 2.2 Polar碼編譯碼原理與SCL譯碼 2.3 LDPC碼編譯碼原理與BP譯碼 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2024b仿真結果如下&#xff08;完整代碼運行后無水印&#xff09;&#xff1a…

AI 產品的 MVP 構建邏輯:Prompt 工程 ≠ 產品工程?(實戰增補篇)

一. 系統思維&#xff1a;產品工程的全局把控&#xff08;實戰增補篇&#xff09; 1. 某智能風控系統的彈性架構實踐 某消費金融公司在開發「30 秒極速貸」產品時&#xff0c;面臨兩大挑戰&#xff1a; Prompt 優化困境&#xff1a;傳統風控模型依賴 “提取用戶信用報告關鍵…

Unity程序集

對于Unity的程序集&#xff0c;具體內容可以參考Unity官方文檔&#xff0c;程序集定義 - 預定義程序集 比如Unity的默認程序集&#xff0c;Assembly-CSharp.dll&#xff0c;還有其他的比如 Assembly-CSharp-Editor.dll&#xff0c;Assembly-CSharp-firstpass.dll 沒有指定或…

【架構藝術】平衡技術架構設計和預期的產品形態

近期筆者因為工作原因&#xff0c;開始啟動team內部部分技術項目的重構。在事情啟動的過程中&#xff0c;內部對于這件事情的定性和投入有一些爭論&#xff0c;但最終還是敲定了下來。其中部分爭論點主要在于產品形態&#xff0c;因為事情涉及到跨部門合作&#xff0c;所以產品…

React和原生事件的區別

一、核心差異對比表 維度原生事件React 事件綁定語法HTML 屬性&#xff08;onclick&#xff09;或 DOM API&#xff08;addEventListener&#xff09;JSX 中使用駝峰式屬性&#xff08;onClick&#xff09;綁定位置直接綁定到具體 DOM 元素統一委托到根節點&#xff08;React …

大模型-modelscope下載和使用chatglm3-6b模型

前言 由于官方chatglm3-6b大模型文件下載比較慢&#xff0c;找到國內modelscope代替方案 1.SDK下載 pip install modelscope2.下載大模型文件 ?方法1:通過pip下載 1.安裝 setuptools 在當前使用的 Python 環境中安裝 setuptools pip install setuptools2.通過如下命令安…

【unity游戲開發——編輯器擴展】AssetDatabase公共類在編輯器環境中管理和操作項目中的資源

注意&#xff1a;考慮到編輯器擴展的內容比較多&#xff0c;我將編輯器擴展的內容分開&#xff0c;并全部整合放在【unity游戲開發——編輯器擴展】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言一、AssetDatabase常用API1、創建資源1.1 API1.2 示例 …