Java并发编程序列之JUC中Condition线程通讯

Java并发编程序列之JUC中Condition线程通讯

Hello,大家好,前面给大家讲解synchronized关键字时给大家讲了下线程间的通讯,wait和notify.这两个API都是定义在Object中的方法,今天要给大家讲的是JUC中的Condition接口来实现线程间通讯,该通讯方式比较灵活一点。文章结构:

  1. Condition通讯与wait,notify通讯的比较
  2. Condition API。
  3. Condition底层模型。

1. Condition通讯与wait,notify通讯的比较

Condition底层的线程等待也是使用的LockSupport的park方法。它对interrupt方法不敏感,而wait方法遇到interrupt就抛异常。直接来张图:

注意图中响应中断这一栏,其实原因上面已经说了。

2. Condition API

说下API,还是一张图:

然后我用土话给大家说一说:await方法,其实就是先释放锁(说白了底层就是更改了AQS的state),然后调用LockSupport的park方法park自己,再把自己丢进Condition的等待队列中。这里不要忘记了,释放锁的同时还通知了同步队列中的线程去拿锁哦。

signal方法其实就是将Condition等待队列中的线程移动到同步队列。至于它拿不拿的到锁,还是另外一回事。

3. Condition底层模型

Condition底层模型:

调用await()时:

调用signal()时:

结语

因为不是太难,所以只给大家看几幅图了。Over,Have a good day .

相关推荐