2011-05-05 39 views
10

我想问一下,当线程被阻塞时,Java是否会利用更多的CPU资源,即等待锁定当前被另一个线程锁定的监视器。Java阻塞的线程占用更多的CPU资源吗?

我现在正在查看一个线程转储,其中一些线程被阻塞,因为它们正在等待锁定显示器,并且我不确定是否可能会对高CPU使用率负责。

谢谢!

编辑(2011年5月6日)我忘了提及此行为是否与Java SE 1.4.2相关。

回答

20

线程会占用内存等资源。阻塞/解锁线程会产生一次性成本。如果一个线程每秒阻塞/解锁数万次,这可能浪费大量的CPU。

但是,一旦线程被阻塞,无论阻塞多长时间,都没有关系,没有持续的成本。

+0

按照@sjlee发布的答案,我知道如果自旋锁与被阻塞的线程有关,那么这最终会导致CPU利用率。因此,难道你不认为说被封锁的线程是低成本的**总是**是有点强**的假设? – 2016-08-25 08:02:56

+0

请原谅我,但我真的很想知道你对我以前的评论的看法。或者,任何链接或指向这个主题的指针都会很棒! – 2016-08-30 05:11:32

+1

@VishalK如果阻塞时间较长,阻塞的线程成本会降低。例如几十毫秒。在很短的时间内,阻塞可能会产生很高的开销。 – 2016-08-30 11:52:54

2

不,监视器上阻塞的线程执行而不是会占用额外的CPU时间。

1

挂起或阻塞的线程不消耗任何CPU时间。

13

答案并不那么简单。可能会出现进入阻塞状态的线程最终导致CPU使用率的情况。

大多数JVM采用分层锁定算法。通常涉及诸如自旋锁之类的算法,特别是对于持续时间短的锁。当一个线程试图获得一个监视器并且发现它不能时,JVM可能实际上把它放在一个循环中,让线程尝试获取监视器,而不是立即将其切换出来。如果线程在一定次数的尝试或持续时间(取决于特定的JVM实现)后未能获得锁,则JVM切换到“上锁”或“膨胀锁”模式,在该模式下上下文会切换线程。

它与自旋锁行为,你可能会招致CPU成本。如果您的代码在很短的时间内保持锁定并且争用率很高,那么CPU利用率可能会出现明显的波动。有关JVM用于降低争用成本的各种技术的讨论,请参见http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html