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