2010-12-09 4 views

답변

36

두 가지 다른 방법은 기능적으로 동일한 입니다. 바이트 코드 수준에서

, 메소드의 액세스 플래그 설정 비트 등의 동기화에 대한 필요성을 알리는 동기화 방법 : 아주 작은 성능 차이가있을 수 있습니다. JVM은이 비트 플래그를 찾고 적절히 동기화합니다.

동기화 된 블록은 클래스 파일의 메서드 정의에 저장된 바이트 코드 작업 시퀀스를 통해 동기화를 구현합니다.

따라서 동기화 된 방법 이 잠재적으로 약간 더 빠르게 실행되고 바이트 코드 측면에서 공간을 적게 차지합니다.

다시 두 사양은 기능적으로 동일합니다.

나는 성능 차이가 미미하고 코드 스타일 가이드 라인이 승리해야한다고 생각합니다. 일부 컴파일러는 블록을 액세스 플래그로 최적화 할 수도 있습니다. JIT는 성능 차이를 해결할 수 있습니다.

+2

+1. 마침내 정비공 세부 사항의 암시 :-) –

9

한 가지 차이점은 동기화되는 코드의 세분성입니다. 첫 번째 예제에서는 본질적으로 전체 메서드를 잠그는 반면 두 번째 예제에서는 메서드의 섹션 만 잠글 것입니다. 두 번째 방법은 몸체를 완전히 동기화 할 필요가없는 긴 메서드에 더 좋습니다. 가능한 한 빨리 다른 스레드에 대한 잠금을 해제하고 해제해야 할 때만 잠금을 설정하는 것이 가장 좋습니다. 이 문서의이 부분 밖으로

+1

그러나 위와 같이 예제에 따라'synchronized (this) '블록이 * 전체 본문 *을 둘러 쌉니까? 바이트 코드 생성 또는 모니터 객체에 차이가 있습니까? –

19

점검 :

http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4

는 설명이 기능적으로 합동 (인스턴스 개체 또는 정적 메소드의 클래스 객체의 경우에는 방법 중 잠금 장치를 동기화하는 동안 메소드가 상주하는 클래스)에서 메소드를 동기화하는 것이 (동기화 된 블록 명령문처럼) 바이트 코드에서 동기화하는 것이 아니라 JVM 레벨에서 동기화되기 때문에 훨씬 더 최적입니다.

+1

+1. 마침내 정비사 세부 정보의 암시와 좋은 링크 (정확한 질문을 다루는 것)가 백업됩니다. –

+0

대단히 감사합니다. – Tarik

관련 문제