AQS原始碼分析

2022-10-09 12:24:07 字數 723 閱讀 3182

如上**,用jmeter模擬30個請求同時下單,結果30個請求都下單成功,產生了超賣問題。

下面實現自定義乙個同步器來實現自定義鎖

/**

* 2021/7/1

* 自定義aqs實現

*/public class mylock

public void setstate(int state)

public thread getlockholder()

public void setlockholder(thread lockholder)

​public void lock()

waiters.add(currentthread);

// 自旋

for (; ; )

// 阻塞當前執行緒 放棄cpu使用權

locksupport.park();}}

​public void unlock()

if (compareandswapstate(getstate(), 0)) }}

​// 是否能加鎖成功

private boolean acquire()

}return false;}​

​// 利用unsafe類實現原子操作改變值

public final boolean compareandswapstate(int expect,

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...

AQS原始碼解析

加鎖從 先看一下 acquire方法開始 private transient volatile node head 頭節點 獲取鎖的執行緒節點 private transient volatile node tail 尾節點node 內部類 共享 static final node shared n...