学习ReentrantLock的condition的wait和signal源码的笔记

condition的wait方法的作用和限制。

1.只有线程获取到锁之后,才可以调用wait方法,否则将报错
2.调用condition.wait之后,当前线程会进入堵塞状态,等待condition.signal之后才可以唤醒。
总结:无论是调用condition.wait和condition.signal方法,前置条件都是线程先获取到锁。

condition的wait和signal方法用到数据结构

我阅读源码有个习惯,就是需要弄清代码的数据结构,只要数据结构弄清楚,大概代码流程也会弄清楚了。
因为调用condition.wait和condition.signal方法,前置条件都是线程先获取到锁,所以还是离不CHL队列。CHL队列,通俗的理解,需要竞争锁,但是竞争不到锁的线程存放队列,结构如下。
在这里插入图片描述

condition 本质就是一个队列,存放着调用condition.wait方法的线程等待队列。结构如下
在这里插入图片描述

标题调用wait方法和signal对象交互图

线程1 condition condition队列 获取到锁 调用wait方法 判断当前前线是否在锁之内,否则异常 创建线程等待节点,进入等待队列 释放当前线程的锁 进入循环等待当中。 只要没别的线程调用signal方法,并且刚好命中当前线程。 即使线程被唤醒,都将会继续挂起,继续等待,while循环中...。 假设当前线程被signal命中,即加入CHL队列当中,就会退出等待循环 继续竞争锁,执行wait()之后内容 线程1 condition condition队列 调用wait方法
线程2 condition condition队列 CHL队列 获取到锁 调用signal方法 判断当前前线是否在锁之内,否则异常 获取等待队列的头节点,出队 将头节点的线程,入队到CHL队列(关键步骤) 唤醒头节点线程 继续执行signal方法后内容 线程2 condition condition队列 CHL队列 调用signal方法

从上面两张图可以看出,关键难以理解就是过程中又和CHL队列交互了。线程调用signal方法的时候唤醒线程,等待队列中头节点线程放入CHL队列中,并且唤醒该线程,被唤醒的线程退出循环等待,继续去竞争锁,执行wait之后的内容。
ps:CHL无论入队和出队操作,都是使用cas操作处理多线程安全问题。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值