ReentrantLock加锁和解锁原理说明?
下文笔者讲述ReentrantLock加锁和解锁的相关简介说明,如下所示
加锁过程
ReentrantLock加锁 实际上调用NonfairSync/FairSync中的lock方法 lock方法,首先调用compareAndSetState(0, 1)方法 如果当前state是0,就改成1,同时调用setExclusiveOwnerThread方法将持有锁线程设置为当前线程,加锁成功; 如果当前state不是0,表示锁被别的线程持有,就用 acquire(1) 方法尝试获取锁 acquire(1) 首先会用 tryAcquire(1) 方法尝试获取锁,该方法会判断state值,是0 那就进行步骤2的操作;不是0但是当前线程等于正持有锁的线程 那就让 state 加1,这就是可重入原理,以上两种情况都不是,获取锁失败 tryAcquire(1)失败就会调用acquireQueued方法将当前线程加入到队列自旋 最后会调用LockSupport的 park 方法获取锁。
释放锁过程
释放锁: 调用NonfairSync/FairSync中release方法 release调用tryRelease(1)方法 tryRelease(1)会将当前state减1,同时把当前持有锁的线程设置为null 最后调用unparkSuccessor方法 该方法里面调用lockSupport的unpark方法释放锁
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。