2011-05-05 5 views
10

스레드가 차단되었을 때 Java가 더 많은 CPU 리소스를 사용하는지, 즉 현재 다른 스레드에 의해 잠겨있는 모니터를 잠그기를 기다리는 지 묻고 싶습니다.Java 차단 스레드가 더 많은 CPU 리소스를 차지합니까?

이제 모니터를 잠그기 위해 대기중인 일부 스레드가 차단되는 스레드 덤프가 생겼습니다. 높은 CPU 사용량에 대해 책임을 질 수 있는지 확실하지 않습니다.

감사합니다.

EDIT (2011 년 5 월 6 일)이 동작이 Java SE 1.4.2과 관련이 있으면 언급하는 것을 잊었습니다.

답변

20

스레드는 메모리와 같은 리소스를 사용합니다. 블로킹/블럭 해제 스레드는 한 번 비용이 발생합니다. 스레드가 초당 수만 번을 차단/차단 해제하면 상당한 양의 CPU를 낭비 할 수 있습니다.

그러나 일단 스레드가 차단되면 얼마나 오래 차단 되었는가에 상관없이 지속적인 비용이 들지 않습니다.

+0

@sjlee 님이 올린 답변에 따르면 스핀 록이 차단 된 스레드와 관련되어 있으면 CPU 사용량이 증가한다는 것을 알게되었습니다. 그러므로 차단 된 스레드를 비용이 적게 들도록 ** 항상 ** ** 조금 ** 강력한 ** 가정이라고 생각하지 않습니까? –

+0

제발 용서해주세요.하지만 제 이전 의견에 대한 당신의 의견을 알고 싶습니다. 또는이 주제에 대한 링크 나 포인터가 좋습니다! –

+1

@VishalK 차단 된 스레드는 상대적으로 오랜 시간 동안 차단하면 비용이 적습니다. 예 : 수십 밀리 초. 매우 짧은 시간 동안 블로킹은 높은 오버 헤드를 가질 수 있습니다. –

2

아니요, 모니터에서 차단 된 스레드는 이 아니며은 추가 CPU 시간을 사용합니다.

1

일시 중단되거나 차단 된 스레드는 CPU 시간을 소비하지 않습니다.

13

답변이 그렇게 간단하지 않습니다. 차단 된 상태로 들어가는 스레드가 CPU 사용을 유발할 수있는 경우가 있습니다.

대부분의 JVM은 계층 적 잠금 알고리즘을 사용합니다. 종종 짧은 시간 동안 잠금을 유지하는 스핀 록과 같은 알고리즘을 사용합니다. 스레드가 모니터를 확보하려고 시도 할 때 모니터를 얻을 수 없다는 것을 알게되면 JVM은이를 루프에 넣고 즉시 스레드를 전환하는 대신 모니터를 확보하려고 시도합니다. 특정 시도 또는 기간 (특정 JVM 구현에 따라 다름) 후에 스레드가 잠금을 획득하지 못하면 JVM은 스레드를 컨텍스트 전환하는 "fat lock"또는 "inflated lock"모드로 전환합니다.

CPU 비용이 발생할 수있는 스핀 록 동작이 있습니다. 매우 짧은 기간 동안 잠금을 유지하고 경합이 높은 코드를 사용하면 CPU 사용률이 상당히 높아질 수 있습니다. JVM이 경합 비용을 줄이기 위해 사용하는 다양한 기술에 대한 설명은 http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html을 참조하십시오.

관련 문제