稀土 2017-12-28
Hello,大家好,前面给大家讲解synchronized关键字时给大家讲了下线程间的通讯,wait和notify.这两个API都是定义在Object中的方法,今天要给大家讲的是JUC中的Condition接口来实现线程间通讯,该通讯方式比较灵活一点。文章结构:
Condition底层的线程等待也是使用的LockSupport的park方法。它对interrupt方法不敏感,而wait方法遇到interrupt就抛异常。直接来张图:
注意图中响应中断这一栏,其实原因上面已经说了。说下API,还是一张图:
然后我用土话给大家说一说:await方法,其实就是先释放锁(说白了底层就是更改了AQS的state),然后调用LockSupport的park方法park自己,再把自己丢进Condition的等待队列中。这里不要忘记了,释放锁的同时还通知了同步队列中的线程去拿锁哦。
signal方法其实就是将Condition等待队列中的线程移动到同步队列。至于它拿不拿的到锁,还是另外一回事。
Condition底层模型:
调用await()时:
调用signal()时:
因为不是太难,所以只给大家看几幅图了。Over,Have a good day .