對AbstractQueuedSychronizer的粗略理解

AbstractQueuedSychronizer理解

從ReentrantLock入手瞭解,其提供了兩種鎖,一種是公平鎖,一種是非公平鎖;

這兩種鎖都繼承了抽象類Sync extends AbstractQueuedSychronizer,裏面有一個抽象方法和兩個主要函數


一、非公平鎖NonfairSync

它是繼承了Sync

對於公平鎖,例如線程1通過lock()獲取鎖,這時候



通過CAS操作compareAndSetState(0,1)判斷,如果state0,則沒有任何線程獲取該鎖,所以置爲1setExclusiveOwnerThread(Thread.currentThread());設置獨佔鎖的擁有者爲當前線程。因爲這時候只有線程1,所以acquire(1)等會再說。

加入現在線程1正在佔有着鎖,這時候線程2也調用lock()獲取鎖,這時候CAS操作失敗,進入acquire(1)函數


這時候tryAcquire(1)其實就是調用NonfairSync裏面重寫的函數,


然後來看nonfairTryAcquire這個函數


接下來是acquireQueued(addWaiter(Node.EXCLUSIVE),arg),其中addWaiter(Node.EXCLUSIVE)是添加一個等待節點到隊列當中,Node.EXCLUSIVE說明添加的是一個獨佔鎖類型的節點


添加完節點之後就會acquireQueued()通過隊列中獲取鎖



以下就是將當前線程掛起,等待中斷喚醒





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章