logo头像

Always believe youself.

并发编程-3

wait/notify

小故事

image.png

image.png

原理 wait/notify

image.png

API

  • obj.wait() 让进入 object 监视器的线程 到 waitSet 等待。obj.wait(time) ,obj.wait(time,纳秒) 纳秒是假的,会在 time 的基础上加 1
  • obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒
  • obj.notifyAll()在 object 上正在 waitSet 等待的线程全部唤醒

他们都是线程之间进行协作的手段,都属于Object 对象的方法。必须获得此对象的锁(即成为 Owner ) 才能调用这些方法。

使用

sleep 和 wait 的区别:

  • sleep 是 线程 方法, wait 是 Object 方法
  • sleep 不需要强制 和 synchroized 配合使用,而 wait 是配合使用的
  • sleep 在睡眠的同时,不会释放锁对象,而 wait 会释放锁对象

  • 状态是一样的 timed_waiting

notify 可能会虚假叫醒,因为是随机挑一个线程。可以使用notifyAll 唤醒所有,每个等待线程的 判断逻辑处需要设置为 while 来判断 钥匙是否送到的逻辑。(保护性的while 循环)

1
2
3
4
5
6
7
8
9
10
11
synchroized(lock){
while(条件不成立){
lock.wait();
}
// 继续干活
}
// 另一个线程

synchroized(lock){
lock.notifyAll();
}

设计模式:保护性暂停

image.png

image.png

一个线程等待另一个线程的结果。

join: 一个线程等待另一个线程的结束。

用的方法都是一样的,GuardedObject 保护性暂停,同步设计模式。

原理之 join(带时间参,不带时间参)

image.png

扩展

image.png

解藕 结果产生者和结果消费者。

image.png

设计模式:生产者&消费者模式

image.png

代码实现:

image.png
image.png
image.png