ReentrantLock重入锁使用原理

更新时间:2020-12-21 14:14:30点击次数:550次

ReeteantLock简单实用

先初始化一个ReentrantLock对象,lock方法是加锁,unlock释放锁。
ReetrantLock加锁原理
ReetrantLock有公平锁和非公平锁

构造函数传入true是公平锁,false是非公平锁。
公平锁


先判断是否有线程持有锁,state为0表示没人持有锁状态,如果没人持有锁,在判断队列是否初始化是否有排队的线程,如果没有则尝试cas加锁,加锁成功设置当前线程并返回成功

如果有人持有锁,判断是否是当前线程,如果是当前线程返回成功

尝试加锁失败,判断队列是否初始化,如果没有就初始化,初始化好在进行一次cas加锁,如果失败就加入队列调用park方法等待
如果队列初始化好,并且有线程排队,直接加入队列调用park方法等待

非公平锁


直接尝试cas加锁,加锁成功设置当前线程并返回成功

判断是否是当前线程,如果是当前线程返回成功

如果还是失败,判断是否有线程持有锁,如果有加入队列调用park方法等待
如果没有再次尝试cas加锁,失败加入队列调用park方法等待老老实实排队

释放锁

设置获取锁线程为空,释放锁并调用unpark方法唤醒下一个线程

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息