通俗理解AQS原理及与Reentrantlock的关系

2 篇文章 0 订阅
1 篇文章 0 订阅

面试时候一个很常见的问题,就是AQS的理解,往往问到Reentrantlock之后,面试官会问,你知道Reentrantlock的实现吗?

Reentrantlock

Reentrantlock翻译过来就是可重入锁,通俗的讲,就是如果一个线程获取到了这个锁,他可以再次获取。但是释放的时候,如果获取了10次,也需要释放10次才能完全释放完毕

也就是说,这里lock 10次,需要unlock 10次才能彻底释放掉锁

AQS

AQS全称 AbstractQueuedSynchronizer 抽象队列同步器,是Reentrantlock的底层实现

Reentrantlock内部有一个AQS对象,这是Reentrantlock实现的核心组件

AQS通俗实现原理

AQS内部有一个变量叫state,代表了加锁的状态,初始状况下state 为0,加锁的线程为null

如果有线程请求进行加锁,会先CAS替换state 的值。简单说一下CAS,CAS就是CompareAndSwap,他是一个native方法,依靠底层硬件来实现,两个比较重要的值为预期值(expect)和更新值(update),若在内存中寻找到一块区域,这块区域的值等于预期值,那么就把那块区域的值更改成更新值。否则则返回,此次操作无效。

CAS的时候,来竞争锁的线程假设他没有加锁,因此预期值(expect)为0,而更新值为1。若此时有线程加锁,预期值不为0,那么此次CAS就会失效。

成功后,CAS操作将state值更新为1,这样就阻止了其他线程获取。然后将拥有锁的线程设置为当前线程。

竞争锁时,会先判断一下当前加锁的线程是不是自己,如果是自己,就把state的值累加1。不是自己,就CAS,若失败了就进入失败的队列,等待下一次竞争。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值