AQS學習

java裏面有不少併發工具類。其實這些併發工具類核心是AQS AbstracQueueSynchrolizor。 下面說一下ReentrantLock如何經過AQS來實現鎖的。java

AQS核心字段

  1. status 鎖的狀態
  2. exclusiveOwnerThread 持有鎖的線程
  3. 等待隊列。 是一個雙向鏈表,存儲的是等待獲取鎖的線程數據。

1、加鎖

  1. 若是status=0,則經過CAS把status改爲1,且把exclusiveOwnerThread指向當前線程
  2. 若是status!=0,exclusiveOwnerThread=當前線程,則status+1
  3. 若是status!=0,exclusiveOwnerThread!=當前線程,則當前線程加入等待隊列,經過LockSupport.park()阻塞當前線程。

2、釋放鎖

  1. 若是exclusiveOwnThread不是當前線程,則拋出異常。
  2. 若是status=1,則把exclusiveOwnThread改爲null,status改爲0,LockSupport.unpark()進行解鎖。
  3. 若是status>1,則status=status-1。
相關文章
相關標籤/搜索