【发布时间】:2014-07-25 05:43:12
【问题描述】:
我知道使用忙等待不是一个好的编程习惯,最好尽可能使用同步对象(等待通知)。但我想知道是否准备好牺牲 cpu 周期,那么忙等待会更快还是等待通知?
我假设等待通知将涉及对同步对象的内在锁定,并且信号可能来自内核以唤醒线程,这使得这种方法比忙碌等待慢得多,在这种方法中,人们可以连续检查一个条件直到满意为止。一旦满足此条件(例如布尔值 == true),线程可能会退出忙等待。据我了解,我觉得忙等待应该更快。
如果我的论点有错误,如果其他人能分享他们的想法并纠正我,我将不胜感激。
【问题讨论】:
-
我可能错了,但是如果强制CPU循环,会不会比允许CPU空闲时慢?
-
我无法相信在现代系统中,你不是在写“金属”,而是在操作系统上运行并通过驱动程序,谁知道有多少操作系统代码等待 IO,那忙等待会比阻塞快得多。但是,嘿,如果有疑问,请尝试两种方法并衡量结果!
-
写一个实验真的比写一个问题要花更长的时间吗?我怀疑你会发现一个快速的实验让你毫无疑问地确定正确的路线。
-
使用
wait()/notify()将是有利的,因为一旦您notify(),(其中一个)等待线程就会收到通知并开始执行。即,调用notify()的线程将不会继续。如果您忙于等待,即使第二个线程设置了第一个线程正在等待的布尔标志,第二个线程仍会执行,直到其时间片完成然后第一个线程启动。 @其他人,如果我错了,请纠正我.. -
@TheLostMind
notify()不会导致调用线程挂起,也不会导致等待线程立即唤醒。相反,被通知线程仍然必须等待通知线程首先离开同步块。关于您的时间片问题:在多核系统中,线程可能真的并行运行!所以你的说法并不完全正确。
标签: java multithreading