
問(wèn)題1什么是AQS作用是什么AQS是線(xiàn)程同步管理框架提供一套通用的線(xiàn)程等待、喚醒、鎖競(jìng)爭(zhēng)機(jī)制問(wèn)題2AQS的組成包含哪些內(nèi)容state狀態(tài)標(biāo)記CLH隊(duì)列每個(gè)節(jié)點(diǎn)對(duì)象中保存的是線(xiàn)程問(wèn)題3AQS獨(dú)占鎖的獲取流程線(xiàn)程調(diào)用lock()獲取獨(dú)占鎖首先執(zhí)行一次CAS嘗試將state的值從0修改為1成功修改將當(dāng)前線(xiàn)程設(shè)置為持有鎖線(xiàn)程獲取鎖成功修改失敗說(shuō)明當(dāng)前鎖被占用進(jìn)而調(diào)用AQS的acquire(1)方法繼續(xù)競(jìng)爭(zhēng)acquire()方法內(nèi)部先調(diào)用tryAcquire()方法非公平鎖最終執(zhí)行nonfairTryAcquire()繼續(xù)判斷當(dāng)前state是否為0如果為0再次通過(guò)CAS修改state的值CAS成功將當(dāng)前線(xiàn)程設(shè)置為獨(dú)占線(xiàn)程獲取鎖成功CAS失敗鎖被其他線(xiàn)程占用獲取鎖失敗state的值不為0判斷當(dāng)前線(xiàn)程是否為獨(dú)占線(xiàn)程如果是累加state計(jì)數(shù)就獲取鎖成功如果不是獲取鎖失敗如果tryAcquire()返回false執(zhí)行addWaiter(),將當(dāng)前線(xiàn)程封裝為獨(dú)占模式的Node節(jié)點(diǎn)通過(guò)CAS放入到雙向同步隊(duì)列的尾部緊接著執(zhí)行acquireQueued(),循環(huán)判斷當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)是否為head頭節(jié)點(diǎn)如果是則再次調(diào)用tryAcquire()競(jìng)爭(zhēng)鎖搶鎖成功將當(dāng)前節(jié)點(diǎn)設(shè)置為新head節(jié)點(diǎn)搶鎖失敗等待其他線(xiàn)程線(xiàn)程釋放鎖后被喚醒。問(wèn)題4共享模式和獨(dú)占模式有什么區(qū)別共享模式同步狀態(tài)可以被多個(gè)線(xiàn)程同時(shí)獲取線(xiàn)程持有鎖其他線(xiàn)程也可以獲取當(dāng)前鎖比如說(shuō)ReentrantWriteReadLock中的讀鎖。獨(dú)占模式同一時(shí)間同步狀態(tài)只能被一個(gè)縣城占有當(dāng)某個(gè)線(xiàn)程持有鎖期間其他線(xiàn)程獲取鎖都會(huì)阻塞問(wèn)題5AQS的公平鎖和非公平鎖有什么區(qū)別公平鎖線(xiàn)程獲取鎖時(shí)若鎖空閑判斷當(dāng)前線(xiàn)程是否位于隊(duì)列頭部如果是則允許搶占鎖如果不是線(xiàn)程進(jìn)入隊(duì)列等待喚醒非公平鎖線(xiàn)程直接搶占鎖如果鎖空閑搶占鎖成功鎖被別的線(xiàn)程持有搶占鎖失敗進(jìn)入等待隊(duì)列等待被喚醒