Condition源碼解讀(二)

本章我們繼續將Condition的最后一個方法signal方法,如果前面沒有看過的可以點擊LockSupport與Condition解析來看看Condition解讀的前半部分。

signal方法:

        public final void signal() {if (!AbstractQueuedLongSynchronizer.this.isHeldExclusively()) {throw new IllegalMonitorStateException();} else {Node var1 = this.firstWaiter;if (var1 != null) {this.doSignal(var1);}}}

signal方法的主要作用就是將線程從Condition隊列中喚醒,前面已經講述過在Condtion的子類ConditionObject內部通過鏈表來維護整個Condtion隊列,并且含有兩個屬性firstWaiter和lastWaiter分別表示隊列頭和隊列尾部,分析方法首先進行檢查當前線程是否持有獨占鎖。目的是保證持有鎖的線程才能調用signal方法來喚醒線程,通過判斷之后開始從Condition隊列中取出隊首線程,隨后開始調用doSignal方法來喚醒線程

        private void doSignal(Node var1) {do {if ((this.firstWaiter = var1.nextWaiter) == null) {this.lastWaiter = null;}var1.nextWaiter = null;} while(!AbstractQueuedLongSynchronizer.this.transferForSignal(var1) && (var1 = this.firstWaiter) != null);}

在dosignal中首先將后面的node設置為鏈表頭部,如果后續沒有node則將尾鏈表置為null。

同時調用transferForSignal(first)嘗試將節點轉移到同步隊列,如果轉移失敗(返回false)且隊列還有節點(firstWaiter != null),繼續處理下一個節點。

下面我們來看看transferForSignal方法是如何進行轉移的。

 final boolean transferForSignal(Node var1) {if (!compareAndSetWaitStatus(var1, -2, 0)) {return false;} else {Node var2 = this.enq(var1);int var3 = var2.waitStatus;if (var3 > 0 || !compareAndSetWaitStatus(var2, var3, -1)) {LockSupport.unpark(var1.thread);}return true;}}

首先進行狀態位的CAS設置,如果無法設置表明狀態已經改變了直接返回false,表示無法入隊。

之后進行入隊enq操作(內部是一個循環不斷的CAS操作保證能入隊)入隊完畢之后則查看當前節點狀態如果還是阻塞狀態則直接調用unpark來喚醒當前線程。

1. 先判斷當前線程是否持有當前鎖沒有則拋出異常

2. 取出Condition隊列中的一個首節點嘗試入隊和喚醒操作

3.失敗則再次循環從隊伍中取出節點

4.在嘗試入隊的方法總首先會判斷狀態值是否符合不符合則直接返回false,符合則會通過CAS循環入隊操作,最后判斷狀態是否為阻塞,為阻塞則直接調用unpark方法進行喚醒操作。

至此Condtion的兩個方法已經介紹完畢。

總結:

await方法:

signal方法:

設計精髓

  1. 雙隊列分離:條件隊列(等待條件)與同步隊列(競爭鎖)分離

  2. 狀態驅動waitStatus?精確控制節點生命周期

  3. 無鎖算法:CAS 操作保證線程安全

  4. 協作式喚醒:前驅節點負責喚醒后繼

  5. 資源繼承:await() 返回時自動恢復原始鎖狀態

典型應用場景

  1. 生產者-消費者:不同條件控制隊列空/滿

  2. 線程池任務調度:工作線程等待任務到達

  3. 資源池管理:連接可用性通知

  4. 屏障實現:所有線程到達后同時釋放

  5. 狀態機轉換:特定狀態變更觸發操作

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

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

相關文章

股票收益率的計算

首先,需要從 Tushare.pro 注冊一個賬號并調用其API獲取股票日線數據(具體操作請查看官網)。 以通過調用tushare獲取股票000001(平安銀行)的股票數據為例,這里不設置日期,那么默認獲取Tushare提供的所有歷史數據。也可…

《算法筆記》13.2小節——專題擴展->樹狀數組(BIT) 問題 D: 數列-訓練套題T10T3

數列(sequence.pas/c/cpp) - 問題描述 一個簡單的數列問題&#xff1a;給定一個長度為n的數列&#xff0c;求這樣的三個元素ai, aj, ak的個數&#xff0c;滿足ai < aj > ak&#xff0c;且i < j < k。 - 輸入數據 第一行是一個整數n(n < 50000)。 第二行n個整…

C# Windows Forms應用程序-001

目錄 項目概述 主要組件及功能 類定義 控件聲明 構造函數 Dispose 方法 InitializeComponents 方法 控件配置詳解 Button 控件 (button1) TextBox 控件 (textBox1) GroupBox 控件 (groupBox1) Label 控件 (label1 至 label5) OpenFileDialog 控件 (openFileDialog1…

2025.5.28總結

今日工作&#xff1a;最近進入了項目的關鍵節點&#xff0c;要求每人每天提兩單&#xff0c;今天周三&#xff0c;下班前只提了一個單。下午開了一場需求服務驗收會&#xff0c;我演示了自己驗收的那個需求&#xff0c;然后講的不是很好。當初再構造數據時請教了一個人&#xf…

Transformer核心技術解析LCPO方法:精準控制推理長度的新突破

原創文章1FFN前饋網絡與激活函數技術解析&#xff1a;Transformer模型中的關鍵模塊2Transformer掩碼技術全解析&#xff1a;分類、原理與應用場景3【大模型技術】Attention注意力機制詳解一4Transformer模型中位置編碼&#xff08;Positional Embedding&#xff09;技術全解析(…

在 WSL 中安裝 JetBrains Toolbox:完整指南

JetBrains Toolbox 是一個非常實用的工具&#xff0c;它可以幫助開發者輕松管理 JetBrains 的各種開發工具&#xff0c;如 IntelliJ IDEA、PyCharm、WebStorm 等。通過它&#xff0c;你可以快速安裝、更新和管理這些工具&#xff0c;極大地提高了開發效率。而在 WSL 環境中安裝…

ZooKeeper 命令操作

文章目錄 Zookeeper 數據模型Zookeeper 服務端常用命令Zookeeper 客戶端常用命令 Zookeeper 數據模型 ZooKeeper 是一個樹形目錄服務,其數據模型和Unix的文件系統目錄樹很類似&#xff0c;擁有一個層次化結構。這里面的每一個節點都被稱為&#xff1a; ZNode&#xff0c;每個節…

Turf.js:前端地理空間分析的瑞士軍刀

在Web開發中,地理空間數據處理已成為許多應用的核心需求。從地圖可視化到位置服務,再到復雜的數據分析,前端開發者需要強大的工具來處理這些任務。Turf.js 作為一款輕量級、模塊化的地理空間分析庫,憑借其豐富的功能和易用性,成為前端開發者的得力助手。本文將深入探討 Tu…

大模型微調

使用 Ollama 微調大語言模型&#xff08;如 LLaMA、Mistral、Gemma 等&#xff09;主要是圍繞 LoRA&#xff08;Low-Rank Adaptation&#xff09;或者 QLoRA 等輕量級微調技術進行的。Ollama 本身是一個部署和運行本地大語言模型的平臺&#xff0c;但其微調能力有限&#xff0c…

《自動駕駛軌跡規劃實戰:Lattice Planner實現避障路徑生成(附可運行Python代碼)》—— 零基礎實現基于離散優化的避障路徑規劃

《自動駕駛軌跡規劃實戰&#xff1a;Lattice Planner實現避障路徑生成&#xff08;附可運行Python代碼&#xff09;》 —— 零基礎實現基于離散優化的避障路徑規劃 一、為什么Lattice Planner成為自動駕駛的核心算法&#xff1f; 在自動駕駛的路徑規劃領域&#xff0c;Lattice…

切換到舊提交,同時保證當前修改不丟失

在 Git 中&#xff0c;可以通過以下幾種方式切換到之前的提交&#xff0c;同時保留當前的提交&#xff08;即不丟失工作進度&#xff09;&#xff1a; 1. 使用 git checkout 創建臨時分離頭指針&#xff08;推薦用于查看&#xff09; git checkout <commit-hash>這會讓…

zookeeper 操作總結

zookeeper 中的節點類型 節點類型命令選項說明?持久節點?無選項&#xff08;默認&#xff09;永久存在&#xff0c;除非手動刪除。?臨時節點?-e與客戶端會話綁定&#xff0c;會話結束自動刪除&#xff08;?不能有子節點?&#xff09;。?順序節點?-s節點名自動追加遞增…

nova14 ultra,是如何防住80°C熱水和10000KPa水壓沖擊的?

暴雨突襲&#xff0c;手忙腳亂護住背包&#xff0c;卻擔心手機被雨水浸濕&#xff1b;泳池里想記錄美好時刻&#xff0c;卻擔心手機掉入水中 &#xff1b;廚房里充滿了高溫水汽&#xff0c;近距離拍攝美食瞬間&#xff0c;手機屏幕花屏&#xff0c;讓人失去了對美食的興趣…… …

flutter加載dll 報錯問題

解決flutter加載dll 報錯問題 LoadLibrary 報錯 126 or 193 明確一點&#xff1a;flutter構建exe 時默認是MSVC的。 1. 先檢查dll 的位數是否滿足 file ***.dll output: PE32 executable (DLL) (console) x86-64, for MS Windows, 19 sections 這種是64位的機器。 滿足的話可…

Mac 版不能連接華為 GaussDB 嗎?我看 Windows 版可以連接?

&#x1f9d1;?&#x1f4bb; GaussDB 用戶 Mac 版不能連接華為 GaussDB 嗎&#xff1f;我看Windows 版可以連接。 &#x1f9d1;?&#x1f527; 官方技術中心 由于 GaussDB 數據庫本身未支持 macOS 系統&#xff0c;所以在 macOS 上的 Navicat 中也未支持該數據庫。 &…

【MySQL成神之路】MySQL索引相關介紹

1 相關理論介紹 一、索引基礎概念 二、索引類型 1. 按數據結構分類 2. 按功能分類 三、索引數據結構原理 B樹索引特點&#xff1a; 哈希索引特點&#xff1a; 四、索引使用原則 1. 創建索引原則 2. 避免索引失效情況 五、索引優化策略 六、索引維護與管理 七、特殊…

五、web安全--XSS漏洞(1)--XSS漏洞利用全過程

本文章僅供學習交流&#xff0c;如作他用所承受的法律責任一概與作者無關1、XSS漏洞利用全過程 1.1 尋找注入點&#xff1a;攻擊者首先需要找到目標網站中可能存在XSS漏洞的注入點。這些注入點通常出現在用戶輸入能夠直接輸出到頁面&#xff0c;且沒有經過適當過濾或編碼的地方…

使用 Shell 腳本實現 Spring Boot 項目自動化部署到 Docker(Ubuntu 服務器)

使用 Shell 腳本實現 Spring Boot 項目自動化部署到 Docker&#xff08;Ubuntu 服務器&#xff09; 在日常項目開發中&#xff0c;我們經常會將 Spring Boot 項目打包并部署到服務器上的 Docker 環境中。為了提升效率、減少重復操作&#xff0c;我們可以通過 Shell 腳本實現自動…

高考加油(Python+HTML)

前言 詢問DeepSeek根據自己所學到的知識來生成多個可執行的代碼&#xff0c;為高考學子加油。最開始生成的都會有點小問題&#xff0c;還是需要自己調試一遍&#xff0c;下面就是完整的代碼&#xff0c;當然了最后幾天也不會有多少人看&#xff0c;都在專心的備考。 Python勵…

HTTP協議接口三種測試方法之-JMeter(保姆教程)

在當今 API 驅動的開發世界中&#xff0c;高效、可靠的 HTTP 接口測試是保障應用質量的關鍵。作為開源性能測試工具中的王者&#xff0c;Apache JMeter 不僅擅長壓力測試&#xff0c;更是進行功能性和回歸測試的利器。本文將手把手教你如何用 JMeter 構建強大的 HTTP 測試計劃&…