手把手带你剖析ReentrantLock的底层实现AQS,GitHub标星50k的Android全栈技术知识

//是ReentrantLock的核心,同时也是其他同步工具CountDownLatch,Semaphore等的核心,有兴趣的朋友在看完这篇文章后,可以自己手动去分析下CountDownLatch,Semaphore的实现

abstract static class Sync extends AbstractQueuedSynchronizer {}

可以看到ReentrantLock的lock方法直接调用了内部成员变量sync的lock方法,这里我们直接分析非公平的实现NonfairSync的实现。

2.AbstractQueuedSynchronizer#compareAndSetState()

//compareAndSetState方法直接调用Unsafe类compareAndSwapInt的方法,保证原子性的替换state的值

protected final boolean compareAndSetState(int expect, int update) {

return U.compareAndSwapInt(this, STATE, expect, update);

}

3.AbstractQueuedSynchronizer#acquire()

public final void acquire(int arg) {

//直接调用tryAcquire去尝试获取锁

//如果尝试获取锁不成功调用acquireQueued

//selfInterrupt挂起当前线程

if (!tryAcquire(arg) &&

acquireQueued(addWaiter(Node.EXCLUSIVE), arg))

selfInterrupt();

}

4.NonfairSync#tryAcquire()

protected final boolean tryAcquire(int acquires) {

//直接调用父类Sync的nonfairTryAcquire方法

return nonfairTryAcquire(acquires);

}

5.Sync#nonfairTryAcquire()

final boolean nonfairTryAcquire(int acquires) {

final Thread current = Thread.currentThread();

int c = getState();

//如果AbstractQueuedSynchronizer的stateE等于0

//代表当前没有线程占有临界资源

//直接调用compareAndSetState,如果CAS成功就把当前线程设置为独占线程

if (c == 0) {

if (compareAndSetState(0, acquires)) {

setExclusiveOwnerThread(current);

return true;

}

}

//如果state不为0,判断占有临界资源的线程是否和当前获取锁的线程是一个线程,如果是调用setState重置当前state的值,这里我们可以看出来,ReentrantLock它是可重入的锁和synchronized一样

else if (current == getExclusiveOwnerThread()) {

int nextc = c + acquires;

if (nextc < 0) // overflow

throw new Error(“Maximum lock count exceeded”);

setState(nextc);

return true;

}

//尝试获取锁还是失败的话

//回到AbstractQueuedSynchronizer的addWaiter方法

return false;

}

6.AbstractQueuedSynchronizer#addWaiter()

private Node addWaiter(Node mode) {

//节点类型有两种

//SHARED共享模式 EXCLUSIVE独占模式

//新建一个独占节点

Node node = new Node(mode);

//这里通过自旋和CAS的方


法将当前节点添加的队列的尾部

//AbstractQueuedSynchronizer内部有两个成员变量head和tail,这里其实就是双向链表实现的一个双端队列。head 和 tail 分别指向双端队列的头尾节点。

for (;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐