美文网首页
转:ReentrantLock 实现原理(未完成)

转:ReentrantLock 实现原理(未完成)

作者: Java旅行者 | 来源:发表于2017-08-27 20:25 被阅读0次

    原文出处: http://www.cnblogs.com/xrq730/p/4979021.html , 主要讲了一些源码,没有讲公平锁和非公平锁

    非公平锁 lock.lock() 简化版的步骤:(非公平锁的核心)

    基于CAS尝试将state(锁数量)从0设置为1

    A、如果设置成功,设置当前线程为独占锁的线程;

    B、如果设置失败,还会再获取一次锁数量,

    B1、如果锁数量为0,再基于CAS尝试将state(锁数量)从0设置为1一次,如果设置成功,设置当前线程为独占锁的线程;

    B2、如果锁数量不为0或者上边的尝试又失败了,查看当前线程是不是已经是独占锁的线程了,如果是,则将当前的锁数量+1;如果不是,则将该线程封装在一个Node内,并加入到等待队列中去。等待被其前一个线程节点唤醒。

    公平锁的lock()

    简化版的步骤:(公平锁的核心)

    获取一次锁数量,

    B1、如果锁数量为0,如果当前线程是等待队列中的头节点,基于CAS尝试将state(锁数量)从0设置为1一次,如果设置成功,设置当前线程为独占锁的线程;

    B2、如果锁数量不为0或者当前线程不是等待队列中的头节点或者上边的尝试又失败了,查看当前线程是不是已经是独占锁的线程了,如果是,则将当前的锁数量+1;如果不是,则将该线程封装在一个Node内,并加入到等待队列中去。等待被其前一个线程节点唤醒。

    总结:公平锁与非公平锁对比

    • FairSync:lock()少了插队部分(即少了CAS尝试将state从0设为1,进而获得锁的过程)

    • FairSync:tryAcquire(int acquires)多了需要判断当前线程是否在等待队列首部的逻辑(实际上就是少了再次插队的过程,但是CAS获取还是有的)。

    区别: 所谓公平锁指的是哪个线程先运行,那就可以先得到锁。非公平锁是不管线程是否是先运行,都是随机获得锁的。

    相关文章

      网友评论

          本文标题:转:ReentrantLock 实现原理(未完成)

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