java裏面有不少併發工具類。其實這些併發工具類核心是AQS AbstracQueueSynchrolizor。 下面說一下ReentrantLock如何經過AQS來實現鎖的。java
AQS核心字段
- status 鎖的狀態
- exclusiveOwnerThread 持有鎖的線程
- 等待隊列。 是一個雙向鏈表,存儲的是等待獲取鎖的線程數據。
1、加鎖
- 若是status=0,則經過CAS把status改爲1,且把exclusiveOwnerThread指向當前線程
- 若是status!=0,exclusiveOwnerThread=當前線程,則status+1
- 若是status!=0,exclusiveOwnerThread!=當前線程,則當前線程加入等待隊列,經過LockSupport.park()阻塞當前線程。
2、釋放鎖
- 若是exclusiveOwnThread不是當前線程,則拋出異常。
- 若是status=1,則把exclusiveOwnThread改爲null,status改爲0,LockSupport.unpark()進行解鎖。
- 若是status>1,則status=status-1。