每天一道面試題,周五打卡沖沖沖!AQS 的原理是什麼?
AQS(AbstractQueuedSynchronizer)的原理是基于一個FIFO(先進先出)隊列和一個同步狀态(state)來實作線程的排隊和同步。
AQS的核心思想是,當線程嘗試擷取同步狀态時,如果同步狀态已經被其他線程占用,則将目前線程包裝成一個節點(Node)并入隊等待,否則直接擷取同步狀态。同時,AQS會確定隻有隊列中第一個節點的線程才能擷取同步狀态,其他節點需要等待前面的節點釋放同步狀态。
AQS的主要實作機制如下:
1. 内部隊列:AQS維護一個FIFO隊列,用于存儲等待擷取同步狀态的線程。每個線程通過Node對象來表示,并包含了線程的引用和狀态資訊。
2. 同步狀态(state):AQS内部維護一個同步狀态,用于表示同步資源的狀态。不同的同步器可以根據自己的需求使用同步狀态來表示不同的含義,如鎖的可重入次數、Semaphore的可用許可數等。
3. CAS操作:AQS使用CAS(Compare and Swap)操作來實作對同步狀态的原子修改。CAS操作通過比較記憶體中的值與期望值,如果相等則進行修改,否則不進行修改。
4. 線程排程:AQS通過自旋(自旋鎖)和阻塞(等待隊列)兩種方式來進行線程的排程。當線程無法擷取同步狀态時,會進入阻塞狀态,直到被前面的節點喚醒。在自旋期間,線程會不斷嘗試擷取同步狀态,避免線程切換的開銷。
#java #程式員 #學習打卡 #面試打卡