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