1.進入aqs同步佇列(基於雙向鍊錶實現)之前
2.進入aqs同步佇列後
非公平鎖第一次搶鎖失敗後,會進入aqs同步佇列排序,當位於隊首時會和其他執行緒開始搶鎖。
公平鎖和非公平鎖的效能是不一樣的,非公平鎖的效能會優於公平鎖。為什麼呢?因為公平鎖在獲取鎖時,永遠是等待時間最長的執行緒獲取到鎖,這樣當執行緒t1釋放鎖以後,如果還想繼續再獲取鎖,它也得去同步佇列尾部排隊,這樣就會頻繁的發生執行緒的上下文切換,當執行緒越多,對cpu的損耗就會越嚴重。
非公平鎖效能雖然優於公平鎖,但是會存在導致執行緒飢餓的情況。在最壞的情況下,可能存在某個執行緒一直獲取不到鎖。不過相比效能而言,飢餓問題可以暫時忽略,這可能就是reentrantlock預設建立非公平鎖的原因之一了。
公平鎖和非公平鎖
公平鎖和非公平鎖的不同是發生在乙個新的執行緒搶占乙個鎖的情況下。1.對於非公平鎖,當乙個新的執行緒想要得到乙個鎖,而這時鎖恰好沒有被別的執行緒占有,那麼這時候這個新的執行緒就可以無視其他執行緒在等待佇列中的排隊,而直接獲取這個鎖,而且不用先加入等待佇列。2,公平鎖,就是乙個新的執行緒想要得到乙個鎖,...
公平鎖與非公平鎖
在reentrantlock中很明顯可以看到其中同步包括兩種,分別是公平的fairsync和非公平的nonfairsync。公平鎖的作用就是嚴格按照執行緒啟動的順序來執行的,不允許其他執行緒插隊執行的 而非公平鎖是允許插隊的。預設情況下reentrantlock是通過非公平鎖來進行同步的,包括syn...
公平鎖和非公平鎖
所謂公平鎖指的是哪個執行緒先執行,那就可以先得到鎖。非公平鎖是不管執行緒是否是先執行,上來就直接嘗試占有鎖,如果嘗試失敗,就再採用類似公平鎖那種方式。我們看下reentrantlock 類的原始碼 公平鎖 protected final boolean tryacquire int acquires...