AQS 核心思想是云矫,如果被請求的共享資源空閑,則將當(dāng)前請求資源的線程設(shè)置為有效的工作線程汗菜,并且將共享資源設(shè)置為鎖定狀態(tài)让禀。如果被請求的共享資源被占用挑社,那么就需要一套線程阻塞等待以及被喚醒時(shí)鎖分配的機(jī)制,這個(gè)機(jī)制 AQS 是用 CLH 隊(duì)列鎖實(shí)現(xiàn)的巡揍,即將暫時(shí)獲取不到鎖的線程加入到隊(duì)列中痛阻。
AQS 定義兩種資源共享方式:
1.公平鎖:按照線程在隊(duì)列中的排隊(duì)順序,先到者先拿到鎖
2.非公平鎖:當(dāng)線程要獲取鎖時(shí)腮敌,先通過兩次 CAS 操作去搶鎖阱当,如果沒搶到,當(dāng)前線程再加入到隊(duì)列中等待喚醒糜工。
CAS:它是一條CPU并發(fā)原語弊添,也是一種無鎖算法。
它的功能是在不使用鎖的情況下實(shí)現(xiàn)多線程之間共享變量的同步啤斗。算法思想:判斷內(nèi)存某個(gè)位置的值是否為預(yù)期值表箭,如果是則更新為新的值,這個(gè)過程涉及到三個(gè)參數(shù)钮莲,分別是:內(nèi)存地址免钻,期望的值以及要修改的值。并且該操作是原子的崔拥。
缺點(diǎn):
1.由于使用了do while循環(huán)极舔,如果多次比對不正確,循環(huán)次數(shù)變多開銷大链瓦,效率變低
2.CAS是對原子包裝類的操作拆魏,所以只能保證一個(gè)共享變量的原子性。
3.會引發(fā)ABA問題
ABA問題的解決方案:
讓原子包裝類對象帶上版本信息慈俯,給對象帶上標(biāo)記渤刃,那么在進(jìn)行比較的時(shí)候就不僅要比對內(nèi)容是否相同,還需要比對版本是否一致贴膘。
所以可使用AtomicStampedReference類來實(shí)現(xiàn)這一功能卖子,該類是在原子引用類的基礎(chǔ)上加上了時(shí)間戳的概念