公平鎖(fairsync)
核心方法:
public final void acquire(int arg)
tryacquire(arg)方法:
protected final boolean tryacquire(int acquires)
}//重入鎖 state+1
else if (current == getexclusiveownerthread())
return false;
}
總結:通過cas嘗試獲取鎖,成功時返回true
hasqueuedpredecessors()方法:
public final boolean hasqueuedpredecessors()
幾種情況下會返回false:
aqs佇列沒有初始化
佇列初始化後,頭節點的下乙個節點存在並且頭節點的下乙個執行緒為當前的執行緒
總結:判斷當前節點的thread是否為有資格競爭鎖。
當鎖存在競爭的時候:
addwaiter()方法:
private node addwaiter(node mode) }//
enq(node);
//返回tail節點
return node;
}
enq()方法:
private node enq(final node node) else }}
}
enq的作用:
1、初始化佇列
2、賦值最新的tail節點
3、採用自旋加cas的方式保證了compareandsethead(new node())和compareandsettail(t, node)成功,當addwaiter()的compareandsettail(pred, node)方法cas失敗時,進入enq()自旋加cas
賦值tail節點。
總結:addwaiter()方法就是為了構建鍊錶結構的佇列。
acquirequeued()方法:
final boolean acquirequeued(final node node, int arg)
//自旋把上乙個節點的ws賦值-1
if (shouldparkafte***iledacquire(p, node) &&
//park當前執行緒
parkandcheckinterrupt())
interrupted = true;
}} finally
}
shouldparkafte***iledacquire()方法:
private static boolean shouldparkafte***iledacquire(node pred, node node) while (pred.waitstatus > 0);
pred.next = node;
} else
return false;
}
AQS原始碼解析
加鎖從 先看一下 acquire方法開始 private transient volatile node head 頭節點 獲取鎖的執行緒節點 private transient volatile node tail 尾節點node 內部類 共享 static final node shared n...
AQS原始碼解析 上
clh佇列 三個人發明的,三個人各取乙個字母命名。aqs abstractqueuedsynchronizer 裡面有基本的模板方法,包括操作同步佇列和條件佇列等。繼承aqs子類可以自己選擇實現的方法有 原始碼解析中術語說明 獲取獨佔鎖 public final void acquire int a...
AQS原始碼分析
如上 用jmeter模擬30個請求同時下單,結果30個請求都下單成功,產生了超賣問題。下面實現自定義乙個同步器來實現自定義鎖 2021 7 1 自定義aqs實現 public class mylock public void setstate int state public thread getl...