java并发编程线程间的通信notify通知的遗漏

Posted 文洁丫头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java并发编程线程间的通信notify通知的遗漏相关的知识,希望对你有一定的参考价值。

       notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块后,threadA再开始wait,便会一直阻塞等待,直到被别的线程打断。

实例见 :https://git.oschina.net/wenjieyatou/threadTest

 

在threadB进行通知之前,先将okToProceed置为true,这样如果threadA将通知遗漏,那么就不会进入while循环,也便不会执行wait方法,线程也就不会阻塞。如果通知没有被遗漏,wait方法返回后,okToProceed已经被置为true,下次while循环判断条件不成立,便会退出循环。

    这样,通过标志位和wait、notifyAll的配合使用,便避免了通知遗漏而造成的阻塞问题。

 

 

 

   总结:在使用线程的等待/通知机制时,一般都要配合一个boolean变量值(或者其他能够判断真假的条件),在notify之前改变该boolean变量的值,让wait返回后能够退出while循环(一般都要在wait方法外围加一层while循环,以防止早期通知),或在通知被遗漏后,不会被阻塞在wait方法处。这样便保证了程序的正确性。

 

以上是关于java并发编程线程间的通信notify通知的遗漏的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程(10):使用wait/notify/notifyAll实现线程间通信的几点重要说明

转:Java并发编程之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明

并发编程:线程之间的通信wait和notify

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

并发编程相关知识

Java多线程编程核心技术读书笔记-线程通信