
AQSAbstractQueuedSynchronizer抽象隊(duì)列同步器在JDK1.5中由Doug Lea實(shí)現(xiàn)它也是JUC包的底層基石是一套用來(lái)實(shí)現(xiàn)鎖、同步器的模板框架。1、重識(shí)AQS我們常見(jiàn)的幾個(gè)類如ReentrantLock、Semaphore和CountDownLatch它們表面上功能各不相同但是它們的核心設(shè)計(jì)都是基于AQS實(shí)現(xiàn)的那么什么是AQS呢通過(guò)一個(gè)簡(jiǎn)答的生活中例子來(lái)說(shuō)明如下圖所示假設(shè)我們?nèi)ヒ恍┱畽C(jī)構(gòu)辦理業(yè)務(wù)假設(shè)今天只有一個(gè)柜臺(tái)對(duì)外開(kāi)放并且柜臺(tái)前有一個(gè)等候區(qū)這里就類似我們的AQS的核心模型在AQS中的state類似柜臺(tái)的狀態(tài)private volatile int state;AQS內(nèi)部的state變量我們可以把它想象成柜臺(tái)叫號(hào)機(jī)當(dāng)state0表示柜臺(tái)空閑狀態(tài)此時(shí)柜臺(tái)資源可用提供服務(wù)此時(shí)叫號(hào)機(jī)呼叫用戶A上來(lái)辦理業(yè)務(wù)當(dāng)用戶A在辦理業(yè)務(wù)的時(shí)候此時(shí)state1表示柜臺(tái)有人在辦理業(yè)務(wù)后續(xù)的用戶需要等待用戶A辦理業(yè)務(wù)結(jié)束。 用戶A辦理業(yè)務(wù)中其他的用戶只能在等候區(qū)排隊(duì)類比AQS等候區(qū)這就是AQS中CLH隊(duì)列雙向等待隊(duì)列如下圖所示CLH隊(duì)列是一個(gè)雙向的鏈表每個(gè)排隊(duì)的線程都被封裝成一個(gè)Node對(duì)象CLH隊(duì)列中是先進(jìn)先出機(jī)制。AQS中線程完整的流程如下圖所示當(dāng)一個(gè)線程A過(guò)來(lái)的時(shí)候線程A檢查state是不是0如果是0表示線程A獲取到了鎖此時(shí)立馬把state改成1然后開(kāi)始執(zhí)行業(yè)務(wù)邏輯如果state是1表示線程A獲取鎖失敗此時(shí)線程A打包成一個(gè)Node然后去CLH隊(duì)列隊(duì)尾排隊(duì)。2、AQS的設(shè)計(jì)Java并發(fā)包的作者Doug Lea設(shè)計(jì)的非常優(yōu)秀他把AQS中state和隊(duì)列這2個(gè)東西抽出來(lái)放在父類里這是經(jīng)典的模板方法設(shè)計(jì)模式如下圖所示AQS作為父類它把最通用的活全部做好了如線程的排隊(duì)、入隊(duì)、出隊(duì)、阻塞線程和喚醒線程這些非常復(fù)雜的邏輯都寫(xiě)好了這樣子類如ReentrantLock它只需要實(shí)現(xiàn)一些最簡(jiǎn)單的邏輯如修改state的值子類只需要實(shí)現(xiàn)tryAcquire()嘗試獲取使用tryRelease()嘗試釋放子類使用這兩個(gè)方法就能修改state的值。 同樣使用AQS作為父類ReentrantLock和CountDownLatch實(shí)現(xiàn)了不同功能aReentrantLock獨(dú)占所它的規(guī)則是我占了別人就不能占有所以他的tryAcquire()邏輯是只要state是0表示線程就可以搶到了鎖然后將state值改成1這樣別人就無(wú)法再搶到鎖。bCountDownLatch共享鎖它的規(guī)則是它的邏輯是只有當(dāng)state減到了0所有的線程才能一起通過(guò)。我們都知道沒(méi)有拿到鎖的線程會(huì)在隊(duì)列中等待獲取鎖那么排在隊(duì)列中的線程是在“死循環(huán)”空轉(zhuǎn)其實(shí)在隊(duì)列中這些線程它們都在睡眠掛起狀態(tài)使用到了一個(gè)秘密大武器即就是LockSupport.park()當(dāng)線程需要等待時(shí)AQS會(huì)調(diào)用這個(gè)方法此時(shí)它不是空轉(zhuǎn)而是直接向操作系統(tǒng)發(fā)指令核心的內(nèi)容是“請(qǐng)把這個(gè)線程掛起暫時(shí)不要給它分配任何CPU時(shí)間片”。然后使用LockSupport.unpark(thread)當(dāng)鎖被釋放時(shí)持有鎖的線程會(huì)調(diào)用這個(gè)方法“喚醒隊(duì)列中的下一個(gè)等待線程。這種線程調(diào)度由操作系統(tǒng)內(nèi)核完成幾乎不消耗CPU資源。3、AQS加鎖到釋放的全過(guò)程1線程A到來(lái)的時(shí)候首先拿到state0搶到鎖后設(shè)為state1開(kāi)始執(zhí)行自己的業(yè)務(wù)邏輯2線程B到了檢查state的時(shí)候發(fā)現(xiàn)state1自己不能搶到鎖。3AQS把線程B打包成node放到隊(duì)列里4AQS調(diào)用LockSupport.park() 線程B在隊(duì)列中處于睡眠狀態(tài)。5線程A執(zhí)行完自己的業(yè)務(wù)邏輯后將state改成06AQS發(fā)現(xiàn)隊(duì)列里還有等待執(zhí)行任務(wù)的線程于是調(diào)用LockSupport.unpark(thread)7線程B被喚醒后拿到state0設(shè)置state1開(kāi)始執(zhí)行自己的業(yè)務(wù)邏輯??偨Y(jié)1AQS用state標(biāo)識(shí)是否可以獲取鎖state0標(biāo)識(shí)可以獲取鎖用CLH隊(duì)列存放無(wú)法獲取鎖的線程等待區(qū)2AQS用了模板方法模式實(shí)現(xiàn)了父類管排隊(duì)子類管規(guī)則3AQS用了LockSupport.park()和LockSupport.unpark(thread)來(lái)實(shí)現(xiàn)高效的線程阻塞和喚醒。學(xué)AI大模型的正確順序千萬(wàn)不要搞錯(cuò)了2026年AI風(fēng)口已來(lái)各行各業(yè)的AI滲透肉眼可見(jiàn)超多公司要么轉(zhuǎn)型做AI相關(guān)產(chǎn)品要么高薪挖AI技術(shù)人才機(jī)遇直接擺在眼前有往AI方向發(fā)展或者本身有后端編程基礎(chǔ)的朋友直接沖AI大模型應(yīng)用開(kāi)發(fā)轉(zhuǎn)崗超合適就算暫時(shí)不打算轉(zhuǎn)崗了解大模型、RAG、Prompt、Agent這些熱門(mén)概念能上手做簡(jiǎn)單項(xiàng)目也絕對(duì)是求職加分王給大家整理了超全最新的AI大模型應(yīng)用開(kāi)發(fā)學(xué)習(xí)清單和資料手把手幫你快速入門(mén)學(xué)習(xí)路線:?大模型基礎(chǔ)認(rèn)知—大模型核心原理、發(fā)展歷程、主流模型GPT、文心一言等特點(diǎn)解析?核心技術(shù)模塊—RAG檢索增強(qiáng)生成、Prompt工程實(shí)戰(zhàn)、Agent智能體開(kāi)發(fā)邏輯?開(kāi)發(fā)基礎(chǔ)能力—Python進(jìn)階、API接口調(diào)用、大模型開(kāi)發(fā)框架LangChain等實(shí)操?應(yīng)用場(chǎng)景開(kāi)發(fā)—智能問(wèn)答系統(tǒng)、企業(yè)知識(shí)庫(kù)、AIGC內(nèi)容生成工具、行業(yè)定制化大模型應(yīng)用?項(xiàng)目落地流程—需求拆解、技術(shù)選型、模型調(diào)優(yōu)、測(cè)試上線、運(yùn)維迭代?面試求職沖刺—崗位JD解析、簡(jiǎn)歷AI項(xiàng)目包裝、高頻面試題匯總、模擬面經(jīng)以上6大模塊看似清晰好上手實(shí)則每個(gè)部分都有扎實(shí)的核心內(nèi)容需要吃透我把大模型的學(xué)習(xí)全流程已經(jīng)整理好了抓住AI時(shí)代風(fēng)口輕松解鎖職業(yè)新可能希望大家都能把握機(jī)遇實(shí)現(xiàn)薪資/職業(yè)躍遷這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費(fèi)領(lǐng)取【保證100%免費(fèi)】