美文网首页
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