程式設計師談話系列 解開AQS的神秘面紗

2022-05-16 08:23:53 字數 796 閱讀 7696

一,談一談什麼是aqs

aqs是乙個用來建立鎖和同步器的框架,使用aqs能夠簡單且高效的構造出應用廣泛的大量的同步器,比如常用的reentrantlock,semaphore『,其他的諸如reentrantreadwritelock,futuretask等等皆是基於aqs非常輕鬆容易的構造出符合我們自己需求的同步器。

二,aqs原理分析

aqs核心思想是,如果被請求的共享資源空閒,那麼將請求資源的執行緒設定為有效執行緒,並且將共享資源設為鎖定狀態。如果被請求的共享資源被占用,那麼就需要一套執行緒阻塞等待已經被喚醒時鎖分配的機制,這個機制時aqs通過clh佇列實現的,將暫時獲取步到鎖的執行緒加入到佇列當中。clh佇列時乙個虛擬的雙向佇列,即不存在佇列例項,僅存在結點之間的關聯關係。aqs將每條請求資源的執行緒封裝成clh鎖佇列的乙個節點,從而實現鎖的分配。

aqs使用乙個int成員變數來表示同步狀態,通過內建的fifo佇列來完成排隊工作,aqs使用cas對該同步狀態進行原子操作實現對值得修改。

三,aqs對資源得共享方式

1,exclusive(獨佔):只有乙個執行緒能執行,如reentrantlock,公平鎖和非公平鎖。

2,share(共享),多個執行緒可以同時執行,比如訊號量 semaphore柵欄 cyclicbarrier閉鎖 countdownlatch等等。

四,aqs底層使用了模板方法模式

要自定乙個aqs首先要繼承abstractqueuesynchronizer並重寫制定的方法,無非就是對state得獲取和釋放。

然後將aqs組合在自定義同步元件得實現中,並呼叫其模板方法,而這些模板方法會呼叫使用者得重寫方法。

程式設計師談話系列 面試總結!

沒辦法,感覺自己又一次的倒在了演算法上。果然平時忽略演算法就會帶來不好的問題。簡單的排序演算法還寫了很久,最後還是用了while迴圈笨方法解決的。1.介紹自己,並且聊一下專案 2.redis方面的問題。比如如何實現持久化,如何實現多執行緒等等 3.redis併發競爭策略,這個我竟然沒想起來,讀寫序列...

轉神秘的程式設計師

二21 極度缺人 programmers 22 神秘的程式設計師們 載於 程式設計師 雜誌2011年第2期。這個系列的漫畫講述程式設計師 這種神秘人類的囧事,故事多 於我身邊的程式設計師朋友,且以網際網路開發背景為主。一27絕望的專案 programmers 21 神秘的程式設計師們 載於 程式設計...

懶惰程式設計師的神秘天賦

假如說,你是乙個經理,環顧所有的員工 嗯,所有人都在忙著噼里啪啦敲鍵盤 對著電腦瘋狂點選滑鼠,咦,不對,有乙個傢伙不是這樣的!這個傢伙躲在角落裡 他在幹什麼呢?慢悠悠的,像乙隻蝸牛一樣轉悠。哦,等等,現在他回到了自己的座位!這個傢伙真的是在工作嗎?你的第一直覺肯定告訴你這個傢伙是最糟糕的員工,他的工...