java源码-ReentrantLock源码分析-2
2024-10-06 22:42:10
继续上篇ReentrantLock分析如何唤醒线程;
当调用lock.unlock()方法最终调用AQS类中的release方法,开始释放锁
tryRelease(1)方法在Sync对象中实现,首先会检查当前占用锁线程是否是释放线程,如果不是则抛出异常,然后再设置state为0,因为独占锁只有一个线程可以操作,所以不需要cas操作
接下来看release(1)方法,获取头节点,判断如果不为0则调用unparkSuccessor(node)方法,首先更新头节点状态为0,获取next节点,
如果next节点为空或者大于0(被取消)则从tail开始找最前面的状态小于0的节点,如果找到唤醒此节点的线程。
然后回到被唤醒线程阻塞的parkAndCheckInterrupt()方法,继续执行返回线程中断状态并清除中断状态
然后如果是调用 lock.lock()方法的话 ,线程如果处于中断状态还会继续获取锁,直到获取锁成功。然后根据中断状态再执行自我中断。
如果是调用lockInterruptibly()/trylock()等方法如果线程被中断,会直接抛出异常,让业务程序自己处理中断请求。
大概ReentrantLock总体源码分析算结束了,如果有不对的地方欢迎指出
最新文章
- c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf
- ITOO 第一个任务,新建界面
- Intellij IDEA中部署Tomcat报错“war exploded: Server is not connected. Deploy is not available”
- 《Cortex-M0权威指南》之Cortex-M0技术综述
- 使用gcc编译gdb调试
- [原创] linux课堂-学习笔记-课程3.Linux目录结构介绍及内核与shell分析
- leetcode第一刷_Triangle
- JavaEE中遗漏的10个最重要的安全控制
- 怎么让自己的java系统使用支付接口
- [Flask Security]当不能通过认证的时候制定跳转
- 淘宝API学习之道:淘宝API相关了解
- 基于html5 Canvas图表库 : ECharts
- mysql创建新用户出现错误处理
- 2017-10-5模拟赛T2 小Z爱排序(sorting.*)
- Linux 常用命令和使用技巧
- ElasticSearch是如何实现分布式的?
- vue项目中引用jquery
- c#: 任务栏进度显示(TaskbarManager)
- 19-EasyNetQ:用EasyNetQ.Hosepipe重新提交错误信息
- Android 懒加载简单介绍