继续上篇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总体源码分析算结束了,如果有不对的地方欢迎指出

最新文章

  1. c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf
  2. ITOO 第一个任务,新建界面
  3. Intellij IDEA中部署Tomcat报错“war exploded: Server is not connected. Deploy is not available”
  4. 《Cortex-M0权威指南》之Cortex-M0技术综述
  5. 使用gcc编译gdb调试
  6. [原创] linux课堂-学习笔记-课程3.Linux目录结构介绍及内核与shell分析
  7. leetcode第一刷_Triangle
  8. JavaEE中遗漏的10个最重要的安全控制
  9. 怎么让自己的java系统使用支付接口
  10. [Flask Security]当不能通过认证的时候制定跳转
  11. 淘宝API学习之道:淘宝API相关了解
  12. 基于html5 Canvas图表库 : ECharts
  13. mysql创建新用户出现错误处理
  14. 2017-10-5模拟赛T2 小Z爱排序(sorting.*)
  15. Linux 常用命令和使用技巧
  16. ElasticSearch是如何实现分布式的?
  17. vue项目中引用jquery
  18. c#: 任务栏进度显示(TaskbarManager)
  19. 19-EasyNetQ:用EasyNetQ.Hosepipe重新提交错误信息
  20. Android 懒加载简单介绍

热门文章

  1. Hive权限管理(十)
  2. Git 简要教程
  3. 内核模式构造-Mutex构造(RecursiveAutoResetEvent)
  4. JavaScript对象原型
  5. solr 数据库关联,表数据添加不进solr,一直indexing
  6. 简单的使用Gson (序列化 和 反序化)
  7. Luogu P3809 【模板】后缀排序(后缀数组板题)
  8. js中彻底删除对象属性
  9. Genymotion 配置
  10. HZOJ 20190727 随(倍增优化dp)