2012-03-07 3 views
3

Java에서 여러 번 사용 된 객체 모니터를 여러 번 보았습니다. 그러나 모든 객체 모니터 논리는 동기화 된 코드 블록 및/또는 방법."모니터"객체를 사용하는 것이 정말로 필요합니까?

동기화 된 코드 블록을 Atomic 프리미티브와 함께 조심스럽게 조정하는 것보다 명시 적 객체 모니터를 사용하는 목적은 무엇입니까?

+0

나는 당신이 당신의 질문에 더 구체적이어야한다고 생각합니다. "객체 모니터 논리"란 무엇을 의미합니까? 표준 Java 용어에서 "동기화"를 사용하면 모니터에서 잠금을 획득합니다. 너 혼란 스럽니? – Jochen

+0

오브젝트가 모니터로 선언되고 사용되는 것을 보았습니다. 일반적인 monitor/notifyAll 논리로 구현하기 위해 임의의 객체를 사용하는 것이 아니라 일반적으로 간단한 부울 또는 동기화 된 블록을 사용할 수 있다고 생각합니다. – jayunit100

답변

2

그러나 모든 객체 모니터 로직은 동기화 된 코드 블록 및/또는 메소드의 사용으로 쉽게 대체 될 수 있다고 생각됩니다.

예, 이것은 물 한 잔을 물 한 잔으로 쉽게 대체 할 수있는 동일한 이유에서 마찬가지입니다. 그것도 똑같습니다. Java의 동기화 된 코드 블록 및 메소드는 언어 수준에서 monitor pattern을 노출합니다.

+0

나는 그것을 좋아한다. 나는 그것이 의견이라는 것에 동의하지 않는다. – duffymo

+0

@duffymo 왜냐하면 내가 생각했던 편집 :) –

4

항상 모니터 개체가 있습니다. 블록을 동기화하면 클래스 인스턴스가 모니터 객체가됩니다.

3) 당신이 당신의 모니터가 도움이 객체 줄 수있는 더 명시 적 공유 자원

2)에 대한 액세스를 동기화하고하는

1) 클래스 인스턴스간에 공유 할 수 있습니다 : 그래서 이유가 명시 적으로 객체를 사용하는 당신은) 아무도 존재하지 구별을하고 (또는 드문 용어를 사용하는

4

더 유연)

4 이름을 지정합니다. Java 용어에서 모니터는 동기화 된 블록에 대한 매개 변수로 사용되는 객체입니다 (또는 동기화 된 인스턴스 메소드의 경우 암시 적으로 this 인스턴스 및 동기화 된 정적 메소드로 클래스 인스턴스).

3

주요한 점은 정상적인 synchronized 블록이 모니터로 둘러싸는 객체를 사용한다는 것입니다. 즉, synchronized(this) { }을 사용하는 것과 같습니다. 문제는 스코핑/가시성 중 하나입니다. 클래스 외부의 모든 클래스는 동일한 인스턴스에서 동기화하고 동기화 논리를 방해하도록 선택할 수 있습니다. private final 참조를 모니터로 사용하면 더 이상 가능하지 않습니다 (반사 헛소리가 없다고 가정).

이 (P61, 4.2.1)은 다음과 같이 Java Concurrency In Practice에서 공식화된다 :

개체의 고유 잠금 (또는 기타 공개적으로 접근 잠금) 대신 개인 락 객체를 사용하는 장점이 있습니다. 잠금 개체를 비공개로 설정하면 클라이언트 코드가 잠금을 캡슐화하므로 공개적으로 액세스 할 수있는 잠금은 클라이언트 코드가 해당 동기화 정책에 올바르게 또는 잘못 참여할 수있게합니다. 부적절하게 다른 객체의 잠금을 획득 한 클라이언트는 생동력 문제를 일으킬 수 있으며 공개적으로 액세스 할 수있는 잠금이 제대로 사용되는지 확인하는 것은 단일 클래스가 아닌 전체 프로그램을 검사해야합니다.

관련 문제