wait-notify/notifyAll 和 循环检测等待有啥区别呢?

两者都需要等,等待的方式不同,一种是忙等(busy waiting),一种是sleep and wake up。前者白白占用CPU资源,后者把自己挂起,然后操作系统去把CPU分配给其他的线程。当CPU资源很宝贵的时候,选择后者。当要求延迟低,而“买烟”又能很快完成时,选择前者,因为后者带来线程上下文切换(context switch)的开销,包括缓存不命中(cachemiss)的开销。
■网友
让一个人去做完某事然后打一个长途电话告诉你结果,还是你每一分钟打一个长途电话确认了解结果合算?如果你每一分钟都要打一个电话,你就什么事情都不能做了。这就是区别。

■网友
如果使用循环检测的话,cpu一直处于忙碌状态,在这期间会一直消耗cpu资源;而在调用wait方法的时候会把cpu资源释放出来,不会占用不必要的cpu资源。不过wait的线程不会自己苏醒,必须要在其他线程调用对象的notify方法去唤醒wait线程注意:调用wait和notify方法时,必须对对象进行加锁操作。调用wait方法时是释放锁,(而在调用notify时是获得锁,因此要注意调用notify的时机,因为一旦调用notify的线程在notify方法之后还有很多步骤的话,那么这个线程就会一直持有这把锁直到线程结束,可能就会导致一些意料之外的情况)
【wait-notify/notifyAll 和 循环检测等待有啥区别呢?】

■网友
对于初学编程的人来说,这是很容易产生的理解误区。即在有限的理解和知识框架体系下,对某些显性结果产生疑惑。所以一般请反向思维,难道这么多大佬都没有发现的这么显而易见的问题吗?答案当然是否定的...从这个问题上说,你至少需要基础的操作系统和计算机组成原理的知识,对线程的中断及抢占机制有基础的了解。处于wait()中的线程是中断的,被挂起的,不会抢占cpu的计算时间;而相反的,无线循环保证了线程的就绪态,会占用cpu时间。占用cpu即会减少其他线程的计算资源,导致性能下降


    推荐阅读