什么是公平锁?什么是非公平锁?
# 什么是公平锁?什么是非公平锁?
其中sync是AbstractQueuedSynchronizer的实现,我们知道,ReentrantLock支持公平锁和非公平锁,其实现类分别是FairSync和NonfairSync,我们看看公平锁和非公平锁分别是怎么实现的
// FairSync 公平锁的实现
final void lock() {
acquire(1);
}
// NonfairSync 非公平锁的实现
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
可以看到,非公平锁的实现仅仅是多了一个步骤:通过CAS的方式(compareAndSetState)尝试改变state的状态,修改成功后设置当前线程以独占的方式获取了锁,修改失败执行的逻辑和公平锁一样。
从这段代码中可以看到,独占锁加锁的核心逻辑就是acquire方法,接下来就看看这个方法
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
1
2
3
4
5
2
3
4
5
这个方法是 AQS 的核心代码。
编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01