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方法就结束了
网友评论