A Q S原始碼分析(shared模式下加鎖)

2021-06-26 11:15:56 字數 841 閱讀 3033

shared模式下加鎖和exclusive模式下加鎖的機制大致相同,都是嘗試加鎖,如果失敗那麼入隊阻塞的邏輯。

但是在獲取到鎖的邏輯有點區別:

private void doacquireshared(int arg) 

}if (shouldparkafte***iledacquire(p, node) &&

parkandcheckinterrupt())

interrupted = true;

}} catch (runtimeexception ex)

}

重點是setheadandpropagate方法,在exclusive下只需要sethead就可以了,看下propagate都做了些什麼:

private void setheadandpropagate(node node, int propagate) 

}

呼叫了doreleaseshared()方法,acquire方法最終呼叫了release方法,得看下為什麼。原因其實也很簡單,shared模式下是允許多個執行緒持有一把鎖的,其中tryacquire的返回值標誌了是否允許其他執行緒繼續進入。如果允許的話,需要喚醒佇列中等待的執行緒。其中doreleaseshared方法的邏輯很簡單,就是喚醒後繼執行緒。這樣就實現了propagate的語義。

其中propagate = -3這個狀態是個令人費解的狀態,在早期的版本中是不存在這個狀態的。這個狀態的意思是即使tryacquire返回值為0,那麼也得去看下是不是需要喚醒後繼結點。

因此acquire的主要邏輯就是嘗試加鎖,如果允許其他執行緒繼續加鎖,那麼喚醒後繼執行緒,如果失敗,那麼入隊阻塞等待。

AQS原始碼分析

如上 用jmeter模擬30個請求同時下單,結果30個請求都下單成功,產生了超賣問題。下面實現自定義乙個同步器來實現自定義鎖 2021 7 1 自定義aqs實現 public class mylock public void setstate int state public thread getl...

AQS原始碼分析 08(LockSupport)

image.png object name image.png originheight 85 originwidth 599 size 5821 status done style none width 570 image.png object name image.png originheigh...

AQS原始碼解析

公平鎖 fairsync 核心方法 public final void acquire int arg tryacquire arg 方法 protected final boolean tryacquire int acquires 重入鎖 state 1 else if current gete...