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