ReentrantLock实现原理.docx
- 文档编号:23322040
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:9
- 大小:589.63KB
ReentrantLock实现原理.docx
《ReentrantLock实现原理.docx》由会员分享,可在线阅读,更多相关《ReentrantLock实现原理.docx(9页珍藏版)》请在冰豆网上搜索。
ReentrantLock实现原理
ReentrantLock实现原理
1,本次分享的目的
1,了解ReentrantLock与Synchronized性能和功能上的区别
2,了解ReentrantLock的主要方法,实现原理
3,畅谈怎样实现分布式锁
2,ReentrantLock与Synchronized
Synchronized是java语言的关键字,是一种由jvm实现的原生语法层面的互斥机制。
ReentrantLock是jdk1.5以后提供的API层面的实现,依赖于CAS操作。
从性能上讲,jdk1.6以前,Synchronized明显要弱于ReentrantLock,随后的版本做了很多优化,现在与ReentrantLock持平。
下面附一张网图,jdk1.5单核处理器条件下两种锁的吞吐量对比:
从功能上讲,Synchronized和ReentrantLock都属于重入,互斥锁。
除此之外,ReentrantLock还具备限时,自行中断,公平锁等独特特点,能满足更多的业务需求。
3,ReentrantLock的主要方法,实现原理
首先说明:
本次分享是基于jdk1.8源码得出的结论,其实与jdk1.7的ReentrantLock相比,也没什么变化。
然后先从一张类图,概览一下ReentrantLock的实现背景:
可以看出,ReentrantLock主要有lock,lockInterruptibly,tryLock,tryLock(longtimeout,TimeUnitunit),unlock方法。
提前剧透一下,ReentrantLock的lock方法根据指定的Sync实现来区分公平与非公平。
lock与lockInterruptibly,tryLock(longtimeout,TimeUnitunit)相比,最主要区别在线程被中断后,是否立即抛异常,也就是上面所说的是否实现了自行中断机制。
lockInterruptibly和tryLock(longtimeout,TimeUnitunit)的区别在于是否实现了限时机制。
看出来了吗,只有tryLock方法独具一格,与世无争。
没错,tryLock是ReentrantLock中性能最佳的方法,所谓曲高和寡,哈哈。
所以,本文主要描述经典的lock方法非公平的实现机制,然后对比公平机制,其它方法的中断机制,限时机制。
a,lock方法
lock方法非公平机制实现流程如下图所示:
从上面流程图可以看出,任何线程都有上来抢占标志的可能,这对于正处在链表中的线程节点而言是不公平的。
但是没有绝对的不公平,因为对于链表中的那些线程节点来说是公平的,因为毕竟每一次进入链表的节点都在队尾。
b,unlock方法
unlock方法没有公平与否,限时与否,自行中断与否之分,流程图如下:
当前线程是结束了,不过下一线程被唤醒了,所以unlock方法流程实际上还没结束。
我们基于上lock方法的流程图,继续填补被唤醒后的线程节点流程:
c,lock方法主要源码
抢占标志:
再抢标志:
进入链表:
更改状态,阻塞等待:
d,unlock方法主要源码
判断标志重入次数:
更改当前线程节点为结束,唤醒下一线程节点:
下一线程节点被唤醒后,再谈条件,下移head指针:
e,处理异常线程节点
在acquireQueued中,如果被唤醒的线程节点已经被外界中断,则会进入cancelAcquire会将中断了的线程节点标识为cancelled,接下来从链表中移除。
另外,在unlock唤醒下一节点时,如果遇到cancelled的节点,会跳过,并从tail向head遍历,找一个正常的线程节点并唤醒。
当然这种节点可能再次被阻塞,因为很有可能不是链表头部节点。
f,与公平锁的区别
回顾一下非公平锁实现流程,公平锁显然不可能有第一步毫无条件地抢占标志。
在第二步时,会判断当前线程节点有无前驱节点,如果有,则会进入链表。
一句话:
公平锁抢占标志的过程必须要排队。
g,与lockInterruptibly的区别
lock方法在判断被唤醒的线程处于中断状态后,会调用该线程的interrupt方法,然而仅仅是在虚拟机中再次标记这个线程已被中断,线程获得标志以后仍然可以进行业务处理;而lockInterruptibly方法则直接抛出异常,当然,业务处理也被中断。
h,与tryLock(longtimeout,TimeUnitunit)的区别
tryLock(longtimeout,TimeUnitunit)除了会抛出中断异常以外,还提供限时中断的功能。
如下图所示:
i,tryLock()方法为什么性能最佳?
一句话,因为没有链表,不需要等待,所以一定也是非公平的。
它的实现主体就是lock非公平实现机制的第二步。
4,畅谈怎样实现分布式锁
标志位,链表,分布式中间件开源框架:
redisson,InterProcessMutex
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ReentrantLock 实现 原理