ReentrantLock分公平锁与非公平锁,此文解析非公平锁代码和使用双向链表的原因
一、加锁代码解析
/**
* Performs non-fair tryLock. tryAcquire is implemented in
* subclasses, but both need nonfair try for trylock method.
*/
@ReservedStackAccess
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
// 非公平锁,直接尝试去拿锁,公平锁则先去看是否需要排队
if (compareAndSetState(0, acquires)) {
// 拿锁成功
setExclusiveOwnerThread(current);
return true;
}
}
// 当前线程已持有锁,重入
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
// 将node放到队尾
private Node addWaiter(Node mode) {
Node node = new Node(mode);
for (;;) {
Node oldTail = tail;
if (oldTail != null) {
node.setPrevRelaxed(oldTail);
// 将node赋予tail,相当于安全的tail = node
if (compareAndSetTail(oldTail, node)) {
oldTail.next = node;
return node;
}