美文网首页
ReentrantLock之非公平锁NonfairSync()

ReentrantLock之非公平锁NonfairSync()

作者: 火兰人一个 | 来源:发表于2017-08-25 18:14 被阅读0次

ReentrantLock的lock:

NonfairSync:(继承了自SYNC,实现了部分方法)

final void lock() {

//利用cas将当前的state从预期的0更新为1,如果成功,则直接将当前线程设置为独占线程。失败执行else

if(compareAndSetState(0,1))

setExclusiveOwnerThread(Thread.currentThread());

else

acquire(1);//调用AQS的acquire,会调用到nonnfairLock的nonfairTryAcquire方法。

}

nonfairTryAcquire方法分析:

final boolean nonfairTryAcquire(intacquires) {

final Thread current = Thread.currentThread();

int c = getState();

if(c ==0) {//如果当前的state为0,首先cas更新状态,如果成功则直接返回,当前线程被设置为独占线程。

if(compareAndSetState(0,acquires)) {

setExclusiveOwnerThread(current);

return true;

}

}

else if(current == getExclusiveOwnerThread()) { //如果当前独占线程是当前线程,那么更新state这里state大于1的原因是nonfairLock是可重入锁,所以一个线程在一次执行过程中会多次获得锁。因此当前请求独占状态的线程可能也是当前持有独占状态的线程,还是因为这个锁是可重入锁。

intnextc = c + acquires;

if(nextc <0)// overflow

throw newError("Maximum lock count exceeded");

setState(nextc);

return true;

}

return false;//否则返回false(代表当前state不等于0,并且当前线程不是持有独占状态的线程,独占状态被其他线程持有,所以这里返回false)

}

接下来还会调用acquireQueued方法,构建节点的方法不再分析(见AQS同步原理),这个方法的目的是利用循环cas方法检测该节点的pre节点是头节点并且该节点可以获取到独占状态,这个时候将该节点设置为头节点,可以理解为获取锁成功。

对ReentrantLock的lock方法的理解需要时刻记住这是一个可重入锁!

这个时候nonfairLock的lock方法就结束了

相关文章

网友评论

      本文标题:ReentrantLock之非公平锁NonfairSync()

      本文链接:https://www.haomeiwen.com/subject/ujcpdxtx.html