AbstractQueuedSychronizer理解
從ReentrantLock入手瞭解,其提供了兩種鎖,一種是公平鎖,一種是非公平鎖;
這兩種鎖都繼承了抽象類Sync extends AbstractQueuedSychronizer,裏面有一個抽象方法和兩個主要函數
一、非公平鎖NonfairSync
它是繼承了Sync
,
對於公平鎖,例如線程1通過lock()獲取鎖,這時候
通過CAS操作compareAndSetState(0,1)判斷,如果state爲0,則沒有任何線程獲取該鎖,所以置爲1,setExclusiveOwnerThread(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()通過隊列中獲取鎖
以下就是將當前線程掛起,等待中斷喚醒