ThreadPoolExecutor 工作線程Worker自身鎖設計

個人博客

ThreadPoolExecutor 工作線程Worker自身鎖設計 | iwts’s blog

總集

想要完整了解下ThreadPoolExecutor?可以參考:

基于源碼詳解ThreadPoolExecutor實現原理 | iwts’s blog

Worker-工作線程管理

線程池設計了內部類Worker,主要是用來管理新建的線程,除了監控,核心的方法是:

  1. 執行。
  2. 申請任務。

此外還包括回收等線程監控類型方法。

由于一個工作線程對象,其中有一個具體的線程,那么本質上是不需要加鎖的。競爭資源是任務隊列,而任務隊列由阻塞隊列來實現。

可以看Worker的設計:

工作線程自身鎖

Worker對象其實本身就是一把鎖。這是個細節,Worker本身是實現了AQS的:

這里其實最主要的作用是工作線程的回收。雖然可以通過維護workers來完成對工作線程生命周期的管理,新建線程比較好理解,但是刪除線程的時候,工作線程本身就是一種競爭資源了。回收的時候是可能恰好碰到調用的。

這里選擇AQS的原因,其實可以看注釋,這邊簡單翻譯一部分:

Worker類存在的主要意義就是為了維護線程的中斷狀態。因為正在執行任務的線程是不應該被中斷的。在線程真正開始運行任務之前,為了抑制中斷。所以把 Worker 的狀態初始化為負數-1。

完全看不懂,這里從其他角度慢慢繞過來解釋一下。

線程的中斷與回收與加鎖時機

解釋這個問題,首先看下Worker自身是從哪里調用鎖的:

  1. 工作線程處理前后加鎖。
  2. 工作線程嘗試中斷時嘗試獲鎖。

第一個看代碼runWorker()

也就是說,當前線程如果在處理,那么本身是給自己加鎖的。
第二個看代碼interruptIdleWorkers()

這里是不是就有點恍然大悟的意思了。

工作線程本身實現AQS,將自身當作競爭對象。

那么工作線程工作的時候,加鎖,鎖住自己,那么interruptIdleWorkers()方法在執行的時候,如果能獲取鎖,就說明一個問題:此時當前線程是沒有在工作的。那么就會被中斷掉。

為了實現這個功能,就只能選擇不可重入鎖,所以自己實現了AQS來實現這個特性。具體可以看代碼實現。

不使用ReentrantLock和synchronized的原因

為啥要加鎖,就是為了區分線程是否中斷,而ReentrantLock和synchronized都有一個重要特性:可重入。因為可重入,那么這個鎖就沒有意義了,因為線程都是一個,既然可重入那么就是必然能獲鎖了。

所以選用AQS,手動刪掉可重入的特性,實現互斥。

tryAcquire實現不可重入

也可以看看重寫AQS的獲鎖代碼:

雖然設置的excluiveOwnerThread,但是完全不用,就是直接CAS獲鎖,沒有重入的特性。

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

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

相關文章

【python】python知名品牌調查問卷數據分析可視化(源碼+調查數據表)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉公眾號👈:測試開發自動化【獲取源碼商業合作】 👉榮__譽👈:阿里云博客專家博主、5…

CleanShot X - 超好用蘋果電腦截圖錄屏工具

Mac 自帶的截圖工具十分雞肋,不僅功能少,無法長截圖外,也不支持 GIF 制作,很難滿足日常做圖需求。 CleanShot X 是一款 Mac 平臺近乎無可挑剔的專業截圖錄屏工具 ,能完美代替 Mac 自帶截圖。它提供超過 50 項功能&…

嵌入式學習——硬件(s3c2440外部中斷、定時器中斷)——day54

1. start.s preserve8area reset, code, readonlycode32entryldr pc, startnopnopnopnopnop ldr pc, interrupt_handlernopstartldr sp, 0x40001000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12;IRQbic r0, r0, #(1 << 7);打開IRQ中斷允許msr cpsr_c, r0ldr …

【ARM CoreLink 系列 7.1 -- TZC-400 控制器 programmers model】

請閱讀【ARM CoreLink 文章專欄導讀】 文章目錄 TZC-400 programmers modelBuild configuration registerAction registerGate keeper registerSpeculation control registerInterrupt status registerTZC-400 programmers model ARM TZC-400(TrustZone地址空間控制器)是一種…

Nacos配置中心客戶端源碼分析(一): 客戶端如何初始化配置

本文收錄于專欄 Nacos 推薦閱讀&#xff1a;Nacos 架構 & 原理 文章目錄 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder總結「AI生成」 前言 專欄前幾篇文章主要講了Nacos作為服務注冊中心相關…

zram壓縮機制看swapon系統調用

1.swapon開啟zram交換分區 swapon /dev/block/zram0 mkswap /dev/block/zram0 上面命令調用了linux的swapon系統調用啟動zram0交換分區;mkswap命令向塊設備文件/dev/block/zram0寫入了swap_header信息 問題:實際安卓平臺是哪里觸發swapon和mkswap調用的,我們已MTK8195平臺…

平衡三進制類腦計算

PS:用來記錄一些新奇又有趣的想法。。。 1、量子的世界 1.1薛定諤的貓 這感覺是個有趣的話題。 在宏觀中可以觀測到的&#xff0c;是穩定的兩種狀態&#xff0c;但隨著尺寸不斷縮小&#xff0c;直至達到微觀尺度&#xff0c;這一切都變的有趣了起來&#xff0c;一只“既死又活…

zabbix server client 安裝配置

Zabbix Server 采用源碼包部署&#xff0c;數據庫采用 MySQL8.0 版本&#xff0c;zabbix-web 使用 nginxphp 來實現。具體信息如下&#xff1a; 軟件名 版本 安裝方式 Zabbix Server 6.0.3 源碼安裝 Zabbix Agent 6.0.3 源碼安裝 MySQL 8.0.28 yum安裝 Nginx 1.20…

Ubuntu20.04安裝vimplus插件

參考文章&#xff1a; Ubuntu Linux下vimplus的安裝及使用安裝vimplus之后亂碼問題解決 1、安裝步驟&#xff1a; $ git clone https://github.com/chxuan/vimplus.git ~/.vimplus$ cd ~/.vimplus$ ./install.sh2、./install.sh 過程 出現選擇是否備份 /home/yin-roc/.vim…

一個中文和越南語雙語版本的助貸平臺開源源碼

一個中文和越南語雙語版本的助貸平臺開源源碼。后臺試nodejs。 后臺 代理 前端均為vue源碼&#xff0c;前端有中文和越南語。 前端ui黃色大氣&#xff0c;邏輯操作簡單&#xff0c;注冊可對接國際短信&#xff0c;可不對接。 用戶注冊進去填寫資料&#xff0c;后臺審批&…

庫存管理系統基于spingboot vue的前后端分離倉庫庫存管理系統java項目java課程設計java畢業設計

文章目錄 庫存管理系統一、項目演示二、項目介紹三、部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 庫存管理系統 一、項目演示 庫存管理系統 二、項目介紹 基于spingboot和vue前后端分離的庫存管理系統 功能模塊&#xff…

熱題系列章節7

劍指 Offer 04. 二維數組中的查找 題目描述&#xff1a; 在一個二維數組中&#xff08;每個一維數組的長度相同&#xff09;&#xff0c;每一行都按照從左到右遞增的順序排序&#xff0c;每一列都按照從上到下遞增的順序排序。請完成一個函數&#xff0c;輸入這樣的一個二維數…

Go 語言環境搭建

本篇文章為Go語言環境搭建及下載編譯器后配置Git終端方法。 目錄 安裝GO語言SDK Window環境安裝 下載 安裝測試 安裝編輯器 下載編譯器 設置git終端方法 總結 安裝GO語言SDK Window環境安裝 網站 Go下載 - Go語言中文網 - Golang中文社區 還有 All releases - The…

策略模式在金融業務中的應用及其框架實現

引言 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為設計模式&#xff0c;它允許在不修改客戶端代碼的情況下&#xff0c;動態地改變一個類的行為。它通過定義一系列算法并將它們封裝在獨立的策略類中&#xff0c;使這些算法可以互相替換&#xff0c;而不會影響…

Spark Cache 的用武之地

在什么情況下適合使用 Cache 我建議你在做決策的時候遵循以下 2 條基本原則&#xff1a; 如果 RDD/DataFrame/Dataset 在應用中的引用次數為 1&#xff0c;就堅決不使用 Cache如果引用次數大于 1&#xff0c;且運行成本占比超過 30%&#xff0c;應當考慮啟用 Cache第一條很好…

各維度卷積神經網絡內容收錄

各維度卷積神經網絡內容收錄 卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;通常是指用于圖像分類的2D CNN。但是&#xff0c;現實世界中還使用了其他兩種類型的卷積神經網絡&#xff0c;即1D CNN和3D CNN。 在1D CNN中&#xff0c;內核沿1個方向移動。1D CNN的輸入和…

高通Android 12 /13根據包名授權懸浮窗權限

代碼路徑frameworks/base/service/core/com/android/server/policy/PhoneWindowManager.java 1、 PhoneWindowManager.java中關于根據包名實現懸浮窗權限授權的功能實現 在實現根據包名授予懸浮窗權限的核心的功能開發中&#xff0c;在通過上述的功能原理實現的過程中分析得知…

EigenLayer 生態解析-再質押與 AVS 崛起

基于以太坊網絡的再質押協議 EigenLayer 提出了利用為以太坊網絡驗證而質押的 ETH 來與其他協議共享安全性和資本效率,同時為協議參與者提供額外利息。在 AVS、再質押、積分系統等概念的推動下,逐漸形成一個龐大的生態系統,從 2024 年初到現在 EigenLayer 的 TVL 增加了 12 …

5.Spring IOC 循環依賴問題源碼深度剖析

Spring IOC 容器解決循環依賴問題主要涉及到幾個關鍵的緩存和對象創建過程中的處理邏輯。以下是對循環依賴問題進行深度剖析的概述&#xff1a; 循環依賴的背景 循環依賴發生在兩個或多個Bean相互依賴對方&#xff0c;形成一個閉環。這可能是直接的&#xff0c;比如Bean A依賴B…

全球最大智能立體書庫|北京:3萬貨位,715萬冊,自動出庫、分揀、搬運

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。 新書《智能物流系統構成與技術實踐》 北京城市圖書館的立體書庫采用了先進的WMS&#xff08;倉庫管理系統&#xff09;和WCS&#xff08;倉庫控制系統&#xff09;&#xff0c;與圖書…