我想问一下,当线程被阻塞时,Java是否会利用更多的CPU资源,即等待锁定当前被另一个线程锁定的监视器。
我现在正在查看一个线程转储,其中一些线程在等待锁定监视器时被阻塞,我不确定这是否可能对高CPU使用率负责。
谢谢!
编辑(2011年5月6日)我忘了提及这种行为是否与 Java SE 1.4.2 相关。
答案 0 :(得分:21)
线程消耗内存等资源。阻塞/解除阻塞线程会产生一次性成本。如果一个线程每秒阻塞/解除阻塞数万次,这可能会浪费大量的CPU。
但是一旦一个线程被阻止,它被阻止的时间并不重要,没有持续的成本。
答案 1 :(得分:15)
答案并非如此简单。在某些情况下,进入阻塞状态的线程可能最终导致CPU利用率。
大多数JVM采用分层锁定算法。通常涉及诸如自旋锁之类的算法,尤其是对于持续时间较短的锁。当一个线程试图获取一个监视器并发现它不能时,JVM实际上可能将它置于一个循环中并让该线程尝试获取监视器,而不是立即将其切换出来。如果线程在经过一定次数的尝试或持续时间后无法获取锁定(具体取决于特定的JVM实现),则JVM切换到“胖锁”或“膨胀锁定”模式,在该模式下,它会执行上下文切换线程。 / p>
使用自旋锁行为会导致CPU成本增加。如果您的代码在很短的时间内保持锁定且争用率很高,那么您可能会看到CPU利用率出现明显的下降。有关JVM用于降低争用成本的各种技术的讨论,请参阅http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html。
答案 2 :(得分:3)
不,在监视器上阻塞的线程不占用额外的CPU时间。
答案 3 :(得分:1)
暂停或阻塞的线程不占用任何CPU时间。