2011-10-22 2 views
5

Java 응용 프로그램을 사용하여 예상 한 속도보다 빠릅니다. 나는 그것을 향상시키는 방법에 대한 많은 검색을했지만 행운은 아니다.Java에서 "동기화 된"코드로 얼마나 많은 시간을 소비하는지 알고 싶습니까?

이제 코드를 검토 중이며 코드에 synchronized 키워드가 많이 있음을 확인했습니다. 자물쇠를 기다리는 데 너무 많은 시간이 걸리면 나는 생각하고있다.

비용이 얼마나 들었는지 확인할 수있는 도구가 있습니까? 따라서 비용이 너무 많이들 경우 더 나은 솔루션을 찾을 수 있습니다.

+2

'동기화'가 필요한 것보다 큰 블록에서 수행되면 불필요한 대기로 인해 성능이 저하 될 수 있습니다. – Cratylus

+1

프로파일 링 도구를 사용해 보셨습니까? – xappymah

답변

4

스레드 모니터 기능을 jvisualvm으로 제안하고 스크린 샷을 찾고있는 동안이 블로그 포스트 : Detecting Thread Contentions을 실행했습니다. 그것은 단지 스크린 샷보다 낫다. :)

그러나 여기 어쨌든입니다 : thread contention in jvisualvm (이미지 제공 : 상기 블로그 게시물)

1

좋은 프로파일 러는 속도 저하를 유발하는 메소드를 정확히 찾아 낼 수있어 동기화와 전혀 관련이 없을 수 있습니다. 또한 프로파일 러의 스레드 상태를 살펴보면 동기화로 인해 너무 많은 대기가 발생하는지 알 수 있습니다. 어쨌든 synchronized 키워드가 이유없이 사용되지 않으면 성능을 위해 동기화 키워드를 제거하는 것이 역효과를 낳을 수 있습니다.

+0

만약'sunchronization'이 필요 없다면 성능 손실로 이어질 것입니다.'동기화 '가 필요하다면 i) 올바른 수준의 세분화가 이루어져야합니다. ii) 제거되면 역효과가 나지 않습니다. – Cratylus

+0

user384706 동의합니다. OP는 코드가 동기화 된 이유를 이해해야 만 적절한 해결책을 얻을 수 있습니다. –

1

동기화의 비용은 일반적으로 작다. 문제는 대개 동기화 블록에서 무엇을하는지입니다. 입출력 (소켓 또는 네트워크)을하지 말고 이상적으로는 시스템 콜을 전혀하지 말고 잠금 작업 시간은 간단한 작업을위한 마이크로 초가 될 것입니다.