type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 ReentrantLock源码笔记
介绍
ReetrantLock 效果是和 synchronized 是一样的,只不过 synchronized 是内置锁,ReetrantLock是语法级别的锁, 相对于而言是比synchronized灵活性高些. 不过从我目前公司写代码角度来看,都是直接使用 synchronized . 但是不妨碍我们来看 ReetrantLock 里面的代码实现
使用代码 : 有lock方法就一定要有 unlock方法来释放锁. 一般代码中这样写即可.
代码分析
ReetrantLock 中是没有什么全局参数,相比于集合,就没有那么多全局参数.但是我们要看其里面的内,这里有三个类, Sync , NonfairSync , FairSync. NonfairSync和FairSync 都是有继承 Sync. 可以看到NonfairSync 是非公平锁 , FairSync是公平锁
Sync 又集成 AQS, 使用独占锁, 重写了 tryRelease 方法
构造函数
默认是使用的非公平锁,如果传入进来的是true就会使用公平锁,否则就会使用非公平锁
lock方法
lock方法是调用的 Sync 的lock方法, 然后我们可以看到上锁的时候,走的Sync,然后根据FairSync/NonfairSync取走各自的加锁方法,所以说公平锁和非公平锁是加锁的方式是不一样的
非公平锁获取锁的时候,会获取state这个状态标识,然后再去走对应的逻辑,这里多了比非公平锁多了一个从队列中获取信息和不能获取锁的线程就会被挂起进入队列中排队
unlock方法
unlock是释放锁的方法. 可以看到释放锁是走的 Sync的release方法,所以不管公平锁还是非公平锁起走的释放锁方法是不一样的
isLocked 方法
判断这个线程是不是被锁了:调用Sync中isLock方法,如果不是0的话,就说明是被锁了,如果是0的话,就说明没有被锁
其他方法
hasQueuedThreads() : 是否有线程在等待队列中
hasQueuedThread(Thread thread) : 线程是否在等待队列中
getQueueLength() : 获取队列中线程个数
🤗 总结归纳
Sync / NonfairSync / FairSync 这个三个类就是 ReetrantLock中的三个类,都是围绕这这三个类在做文章
公平锁和非公平锁的获取锁方式不一样,但是释放方式是一样的. 公平锁获取锁的时候,如果有线程持有了的话,那么其他的会被挂起并且进入等待队列. 而非公平锁,直接获取锁,就是抢占式
📎 参考文章
有关文章的问题,欢迎您在底部评论区留言,一起交流~