Java中的wait和notify、Condition接口的使用

Java中的wait和notify機制

基礎概念

在Java中,wait()notify()Object類的原生方法,用于實現線程間的協作:

  1. wait()

    • 使當前線程釋放對象鎖并進入等待狀態
    • 必須在synchronized代碼塊內調用
    • 語法:obj.wait()obj.wait(long timeout)
    • 線程狀態變化:RUNNING → WAITING
  2. notify()

    • 隨機喚醒一個在該對象上等待的線程
    • notifyAll()喚醒所有等待線程
    • 同樣必須在synchronized代碼塊內調用
// 生產者-消費者示例
class Buffer {private int data;private boolean available = false;public synchronized void produce(int value) {while (available) wait();  // 等待消費者取走數據data = value;available = true;notifyAll();  // 喚醒消費者}public synchronized int consume() {while (!available) wait();  // 等待生產者寫入數據available = false;notifyAll();  // 喚醒生產者return data;}
}

執行流程
graph LRA[線程調用wait] --> B[釋放對象鎖]B --> C[進入等待隊列]D[其他線程調用notify] --> E[喚醒等待線程]E --> F[線程嘗試重新獲取鎖]F --> G[獲取鎖后繼續執行]


Condition接口(java.util.concurrent.locks)

核心方法

Condition接口提供了更靈活的線程協調機制,需配合Lock使用:

  1. await()

    • 功能類似wait(),但支持更豐富的等待條件
    • 可響應中斷:awaitUninterruptibly()
    • 支持超時:await(long time, TimeUnit unit)
  2. signal()

    • 喚醒單個等待線程(類似notify()
    • signalAll()喚醒所有等待線程
使用示例
import java.util.concurrent.locks.*;class ConditionExample {private final Lock lock = new ReentrantLock();private final Condition notFull = lock.newCondition();private final Condition notEmpty = lock.newCondition();private int[] buffer = new int[10];private int count = 0;public void produce(int item) throws InterruptedException {lock.lock();try {while (count == buffer.length) notFull.await();  // 緩沖區滿時等待buffer[count++] = item;notEmpty.signal();   // 喚醒消費者} finally {lock.unlock();}}public int consume() throws InterruptedException {lock.lock();try {while (count == 0) notEmpty.await();  // 緩沖區空時等待int item = buffer[--count];notFull.signal();      // 喚醒生產者return item;} finally {lock.unlock();}}
}


對比分析

特性wait/notifyCondition
鎖機制必須配合synchronized必須配合Lock實現
多條件等待不支持支持創建多個Condition實例
中斷響應僅基礎中斷提供awaitUninterruptibly()
超時控制有限支持精確到納秒的超時控制
公平性依賴synchronized可通過ReentrantLock配置
喚醒精確性notify隨機喚醒signal可定向喚醒特定條件隊列

最佳實踐

  1. 循環檢查條件
    始終在循環中檢查等待條件,避免虛假喚醒:

    while (!condition) {obj.wait();
    }
    

  2. 資源釋放
    使用try-finally確保鎖釋放:

    lock.lock();
    try {// 臨界區代碼
    } finally {lock.unlock();
    }
    

  3. 選擇建議

    • 簡單場景:優先使用synchronized + wait/notify
    • 復雜同步:使用Lock + Condition(如多條件隊列、公平鎖需求)

注意:Java 5+推薦使用java.util.concurrent包中的高級同步工具(如BlockingQueue),僅在底層控制需要時使用wait/notify或Condition。

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

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

相關文章

【Modern C++ Part9】Prefer-alias-declarations-to-typedefs

條款9&#xff1a;優先使用聲明別名而不是typedef 我有信心說&#xff0c;大家都同意使用STL容器是個好的想法&#xff0c;并且我希望&#xff0c;條款18可以說服你使用std::unique_ptr也是個好想法&#xff0c;但是我想絕對我們中間沒有人喜歡寫像這樣std::unique_ptr<std:…

STM32第二十一天定時器TIM

1 定時器基礎知識a:上來說就是用來定時的機器&#xff0c;是存在于STM32單片機中的一個外設。STM32總共有8個定時器&#xff0c;分別是2個高級定時器(TIM1、TIM8)&#xff0c;4個通用定時器 (TIM2、TIM3、TIM4、TIM5) 和2個基本定時器 (TIM6、TIM7)&#xff0c;如下圖所示&…

鼎捷T100程序開發:校驗程序詳解

校驗程序概述 T100系統校驗程序需要確保系統數據的準確性、完整性和一致性&#xff0c;相當于企業信息系統的"健康體檢醫生"。它通過預設規則掃描系統數據&#xff0c;識別異常和錯誤&#xff0c;確保業務運行可靠。通過持續完善的校驗機制&#xff0c;企業能夠構建數…

BaseDao 通用查詢方法設計與實現

BaseDao 通用查詢方法設計與實現 一、通用查詢方法設計思路 1. 核心查詢功能矩陣查詢類型方法名功能說明復雜度主鍵查詢findById()根據主鍵獲取單個實體?全量查詢findAll()獲取全部實體?條件查詢findByCondition()動態條件查詢???分頁查詢findPage()分頁結果集????排序…

llama.cpp gguf主要量化方法

量化是一種通過降低模型參數的表示精度來減少模型的大小和計算存儲需求的方法&#xff0c;如把單精度fp32轉化為int8來減少存儲和計算成本。 常見的是線性量化&#xff0c;公式 r S(q-Z)&#xff0c;將實數值r映射為量化的整數值q&#xff0c;其中縮放因子S和零點Z根據參數分…

汽車級MCU選型新方向:eVTOL垂槳控制監控芯片的替代選型技術分析

摘要&#xff1a;隨著eVTOL&#xff08;電動垂直起降航空器&#xff09;領域的蓬勃發展&#xff0c;對于高性能、高可靠性的垂槳控制監控芯片的需求日益迫切。本文旨在深入探討汽車級MCU&#xff08;微控制單元&#xff09;在這一新興領域的應用潛力&#xff0c;以國科安芯推出…

Deepoc具身智能大模型:送餐機器人如何學會“讀心術”

Deepoc具身智能大模型&#xff1a;送餐機器人如何學會“讀心術”深夜十點的商場火鍋店&#xff0c;一臺銀色機器人正穿越喧鬧的人群。當它感知到奔跑的兒童突然變向&#xff0c;驅動輪立即反向微調0.3度&#xff1b;托盤上的牛油鍋底因顧客推椅產生晃動&#xff0c;平衡系統瞬間…

學習設計模式《十七》——狀態模式

一、基礎概念 狀態模式的本質是【根據狀態來分離和選擇行為】。 狀態模式的定義&#xff1a;允許一個對象在其內部狀態改變時改變它的行為&#xff1b;對象看起來似乎修改了它的類。 認識狀態模式序號認識狀態模式說明1狀態和行為通常指的是對象實例的屬性的值&#xff1b;而行…

python的婚紗影樓管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 隨著婚紗…

濾波電路Multisim電路仿真實驗匯總——硬件工程師筆記

目錄 1 濾波電路基礎知識 1.1 濾波電路的分類 1.1.1 按頻率選擇性分類 1.1.2 按實現方式分類 1.2 濾波電路的設計 1.2.1 確定濾波器類型 1.2.2 計算截止頻率 1.2.3 選擇濾波階數 1.2.4 考慮元件參數 1.2.5 仿真驗證 1.3 濾波電路的應用 1.3.1 電源濾波 1.3.2 音頻…

C++隨機打亂函數:簡化源碼與原理深度剖析

文章目錄一、Fisher-Yates洗牌算法核心原理二、std::random_shuffle簡化實現與缺陷分析簡化源碼&#xff08;核心邏輯&#xff09;原理層面的致命缺陷三、std::shuffle的現代改進與實現簡化源碼&#xff08;核心邏輯&#xff09;原理層面的關鍵改進四、隨機數生成器工作原理URB…

DBeaver連接MySQL8.0報錯Public Key Retrieval is not allowed

DBeaver 鏈接本地mysql8.0服務報錯Public Key Retrieval is not allowed為什么會出現這個錯誤&#xff1f;MySQL 8.0 默認使用新的認證插件&#xff1a;caching_sha2_password某些客戶端&#xff08;比如老版本的 JDBC 驅動或配置不當的 DBeaver&#xff09;在連接時&#xff0…

SpringBoot系列—統一功能處理(攔截器)

上篇文章&#xff1a; SpringBoot系列—MyBatis-plushttps://blog.csdn.net/sniper_fandc/article/details/148979284?fromshareblogdetail&sharetypeblogdetail&sharerId148979284&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 攔…

《匯編語言:基于X86處理器》第7章 整數運算(3)

本章將介紹匯編語言最大的優勢之一:基本的二進制移位和循環移位技術。實際上&#xff0c;位操作是計算機圖形學、數據加密和硬件控制的固有部分。實現位操作的指令是功能強大的工具&#xff0c;但是高級語言只能實現其中的一部分&#xff0c;并且由于高級語言要求與平臺無關&am…

應用筆記|數字化儀在醫學SS-OCT中的應用

引言近些年來&#xff0c;OCT&#xff08;光學相干斷層掃描&#xff0c;Optical Coherence Tomography&#xff09;作為一種非破壞性3D光學成像技術逐漸在醫學眼科設備中流行起來。OCT可提供實時一維深度或二維截面或三維立體的圖像&#xff0c;分辨率可達微米&#xff08;μm&…

Ubuntu 22.04與24.04 LTS版本對比分析及2025年使用建議

Ubuntu 22.04與24.04 LTS版本對比分析及2025年使用建議 在2025年的技術環境下&#xff0c;Ubuntu 22.04和24.04 LTS各有優勢&#xff0c;選擇哪一個取決于具體應用場景和用戶需求。經過對系統內核、桌面環境、軟件生態、生命周期支持等多方面因素的綜合分析&#xff0c;本報告將…

Linux進程的生命周期:狀態定義、轉換與特殊場景

前言 在Linux系統中&#xff0c;進程是資源分配和調度的基本單位&#xff0c;而進程狀態則是理解進程行為的關鍵。從運行中的任務&#xff08;TASK_RUNNING&#xff09;到僵尸進程&#xff08;EXIT_ZOMBIE&#xff09;&#xff0c;每個狀態都反映了進程在內核調度、資源等待或父…

神經網絡簡介

大腦的基本計算單位是神經元&#xff08;neuron&#xff09;。人類的神經系統中大約有860億個神經元&#xff0c;它們被大約10^14-10^15個突觸&#xff08;synapses&#xff09;連接起來。下面圖表的左邊展示了一個生物學的神經元&#xff0c;右邊展示了一個常用的數學模型。每…

多路由協議融合與網絡服務配置實驗(電視機實驗)

多路由協議融合與網絡服務配置實驗文檔 一、實驗用途和意義 &#xff08;一&#xff09;用途 本實驗模擬企業復雜網絡環境&#xff0c;整合 OSPF、RIPv2 動態路由協議&#xff0c;結合 DHCP、FTP、Telnet 服務配置及訪問控制策略&#xff0c;實現多區域網絡互聯、服務部署與…

在指定conda 環境里安裝 jupyter 和 python kernel的方法

在 Conda 的指定環境中安裝 Jupyter 和 Python Kernel 是一個常見操作,以下是詳細步驟,確保在指定環境中正確配置 Jupyter 和 Python Kernel: 1. 準備工作 確保已安裝 Anaconda 或 Miniconda,Conda 環境管理工具可用。確認已創建或計劃使用的 Conda 環境。2. 步驟:安裝 J…