面试时候一个很常见的问题,就是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,若失败了就进入失败的队列,等待下一次竞争。