美文网首页
等待通知经典范式

等待通知经典范式

作者: 码而优则仕 | 来源:发表于2020-04-12 19:03 被阅读0次

wait()系列方法,使进入同步块的当前线程进入等待状态,返回条件是其他线程调用notify()系列函数或Interupt()系列函数,

wait()系列方法和notify()系列函数系列函数的搭配使用就可以实现线程间的顺序操作

注意调用wait系列函数和notify系列函数的前提是获取到了对应的锁,否则是会报错的!

一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者是消费者。

下面介绍等待通知的经典范式:

等待方遵循如下原则:

  1. 获取对象的锁
  2. 如果条件不满足,那么调用对象的wait()方法,被通知后任然要检查条件
  3. 条件满足则执行对应的逻辑。

伪代码如下:

synchronized(锁对象){
  while(条件不满足){
    对象.wait()
  }
  对应的处理逻辑。。。。。
}

为何上面的原则第二条特别强调,被通知后任然要检查条件,这是因为线程调用锁对象的wait()方法后会被放置到等待队列(条件队列),其他线程调用锁对象的notify系列函数之后等待队列中的线程会被移动到阻塞队列中(尝试获取锁未获获取到的线程都被放置在阻塞队列中);所以阻塞队列中不单单有条件队列中被唤醒的线程还有获取锁失败的线程;这些线程都可以竞争锁;所以不能保证被唤醒的线程能够马上获取到锁进入同步块继续执行也就没发保证被唤醒的线程从wait()返回后之前唤醒的条件还成立,所以需要再检查。

伪代码中检查条件使用的是循环检查就是为了实现 被通知后任然要检查条件的原则,如果使用if条件检查就做不到—if检查不是循环的而是顺序的,唤醒线程从wait()方法返回后就不会再检查条件了。

通知方遵循如下原则:

  1. 获得对象的锁
  2. 改变条件
  3. 通知所有等待在对象上的线程

对应的伪代码如下:

synchronized(锁对象){
  改变条件
    对象.notifyAll();
}

为何要使用notifyAll()还是之前的道理,通知线程唤醒的线程会被从等待队列移动到阻塞队列,阻塞队列中不单单有等待线程还有通知线程,且有等待获取锁的和等待从wait返回的线程,不能保证唤醒的线程就是等待被唤醒的线程也有可能是等待进入同步队列的线程。

相关文章

  • Java并发编程基础-线程间通信

    章节目录 volatile 与 synchronized 关键字 等待/通知机制 等待/通知经典范式 管道输入/输...

  • 等待/通知经典范式

    等待方 通知方

  • 等待通知经典范式

    wait()系列方法,使进入同步块的当前线程进入等待状态,返回条件是其他线程调用notify()系列函数或Inte...

  • 第四章 并发编程基础

    线程的状态。如何启动和终止线程。多线程之间通信的基本方式。多线程编程的等待/通知的经典范式。 现代操作系统调度的最...

  • 线程运用---等待通知的范式wait()、notify()

    1.等待线程获取到对象的锁,调用wait()方法,放弃锁,进入等待队列2.通知线程获取到对象的锁,调用对象的not...

  • 线程间通信

    1 Java经典的等待/通知机制 在java中的等待通知机制就是,一个线程让其他线程从wait方法返回。前提:wa...

  • 等待通知

    高考过去一段时间了,现在身边一本的同学们已经知道学校。我还在等结果。报志愿那几天,真的,苦思冥想,自己翻来覆去,...

  • 等待通知

    江苏省480的总分,407就能上北大。只需要84.75% 加油,状元们。

  • 等待通知

    等待通知 文/严章强 在这个春花烂漫的季节里 本早该在学校上课的你们 因这场新冠病毒肺炎 影响了你们上学 封城防控...

  • 等待通知

    因为突发的疫情,原来通知的5月5日至10日居家办公,明天是否放开,能否正常去公司上班还是未知数。 从昨天的核酸检测...

网友评论

      本文标题:等待通知经典范式

      本文链接:https://www.haomeiwen.com/subject/xembmhtx.html