ReentrantLock的加锁流程是怎么样的?

1 个回答

  • 粑粑
    自己喜欢的东西,就不要问别人好不好。
    ReentrantLock非公平锁的加锁流程: 1.尝试着使用CAS操作将锁的状态state由0修改为1,修改成功则线程获得锁。 2.不成功就会再次尝试去抢锁,以及判断这个线程是否是当前持有锁的线程(如果是只需要将state+1,代表锁重入)。 3.抢锁没成功,也不是持有锁的线程,那么就会添加到等待队列然后调用Lock.Support.park()方法进行阻塞等待,然后被唤醒。 ![image.png](https://images.codewd.com/26034ff44a2a0ac6bebb60730c1edb0d.png) 公平锁加锁过程: 1.如果当前锁没有被其他线程持有,并且等待队列中也没有其他线程等待,那么就使用CAS操作去抢锁。 2.或者线程就是当前持有锁的线程,那么就对state+1,代表锁重入。 3.以上情况都不是,就加入到等待队列进行等待。 非公平锁解锁流程 ![image.png](https://images.codewd.com/15aa3f9dfebab91e6471540dadbb3eb8.png) [https://blog.csdn.net/qq_14996421/article/details/102967314](https://blog.csdn.net/qq_14996421/article/details/102967314) [https://blog.csdn.net/fuyuwei2015/article/details/83719444](https://blog.csdn.net/fuyuwei2015/article/details/83719444)
    发布于 2022-02-16 23:45 •IP属地 河北
    举报
    评论
    收藏