2012-03-24 1 views
55

Java 스레드에 관한 기사를 읽는 동안 종종 "현재 스레드가이 객체의 모니터 소유자"라는식이 나타납니다. 나는 의미를 얻는다 : 스레드는 객체를 조작 할 권한을 얻는다. 그러나 나는 "물체의 자물쇠"대신 "물체의 모니터"라는 문구를 사용하는 이유에 대해 의아해합니다.자바에서 객체 모니터의 의미는 무엇입니까? 왜이 단어를 사용합니까?

간단히 말해서, 나는 '모니터'라는 단어의 의미를 모른다. 질문이 이상하고 간단 할 수있다. 그러나 누구든 해결을 도울 수 있기를 바랍니다. 3ks

+1

귀하의 질문에 실제로 대답 할 수있는 유일한 사람이라면 +1 할 수 있습니다. 우리는 이것을 "모니터"라고 부릅니다. 그 이유는 Hoare가 1974 년에 전화를했기 때문입니다. –

답변

36

하지만 "객체의 잠금 장치"라는 단어를 사용하는 이유가 의아해합니다.

이 문맥에서 사용 된 용어 "모니터"를 설명하는 링크에 대한 ulmangt의 대답을 참조하십시오.

"잠금"대신 "모니터"라는 용어를 사용하는 이유는 무엇입니까? 물론 엄밀히 말하자면,이 용어는 다른 것들을 의미합니다 ... 특히 원래 의도 된대로 사용하면 더욱 그렇습니다.

  • "잠금"은 특정 잠금 속성을 유지하는 획득 및 릴리스 프리미티브가있는 항목입니다. 예 : 단독 사용 또는 단일 작성기/다중 판독기.

  • "모니터"는 주어진 시간에 주어진 섹션 (또는 섹션)을 하나의 스레드 만 실행할 수 있도록하는 메커니즘입니다. 이는 잠금 (그리고 상태를 충족시키는 다른 스레드를 기다리거나 다른 스레드에 알림을 보내는 "조건 변수")을 사용하여 구현할 수 있지만 단순한 잠금 이상의 의미가 있습니다. 실제로 Java의 경우 모니터가 사용하는 실제 잠금에 직접 액세스 할 수 없습니다. (당신은 당신이 자바 Lock 인스턴스 수처럼 ... 그것을 취득에서 다른 스레드를 방지하기 위해 "Object.lock()"를 말할 수 없습니다.) 한마디로

, 한 학자가 될 것 인 경우 "모니터"는 실제로 Java가 제공하는 것을 특징 짓기 위해 "잠금"보다 더 나은 용어입니다. 그러나 실제로는 두 용어가 거의 같은 의미로 사용됩니다.

+1

감사합니다. – jiafu

+0

다른 질문이 있습니다. 모든 객체에는 힙 데이터의 housekeerp 필드에 자체 잠금 정보가 있습니다. 그것의 용도는 무엇입니까? – jiafu

+0

@ jiafu - 이것이 자바 언어가 지정되는 방식이기 때문에 필요합니다. 그러나 실제로 객체의 잠금이 실제로 사용되지 않는 한 오버 헤드는 일반적으로 1 단어 미만입니다. –

4

모든 객체에는 모니터가 내장되어있어 일부 코드에서 사용되기를 기다리고 있습니다. 실제로 대부분의 객체는 모니터로 사용되지 않으므로 모니터를 사용할 때까지 모니터를 만들지 않아도됩니다. 이 기능을 전용 모니터 모니터 필드가있는 모든 개체로 구현하는 대신 글로벌 HashMap 모니터가있는 JVM으로 구현하는 것으로 생각하십시오.

가능한 구현은 다음과 같습니다. 동기화 된 블록이 입력 될 때마다 JVM은 동기화 된 객체를지도 (모니터)에서 찾습니다. 발견되면 모니터가 사용하게됩니다. 찾지 못하면 맵 전용 영역으로 들어갑니다. 그런 다음 다른 스레드가 이전 검사와 임계 영역 입력 사이에 스레드를 작성했을 수 있으므로 오브젝트를 다시 찾습니다.여전히 존재하지 않으면 동기화 된 개체에 대한 모니터를 만들고 임계 구역을 벗어납니다.

+0

3k 도움 – jiafu

5

synchronized 블록은 object 블록이 개체의 잠금을 제어하는 ​​모니터입니다. 여기에 예제가 있음

synchronized (object) { 
    while (<condition does not hold>) 
     object.wait(timeout); 
    ... // Perform action appropriate to condition 
} 
1

Java 가상 머신은 모니터를 사용하여 멀티 스레딩을 지원합니다. 모니터는 스레드를 실행하는 동안 상호 배타 (여기에는 '잠금'이 그림으로 표시됩니다)와 스레드 간 통신의 수단으로 조정 (여기에는 객체의 대기 및 통지 메소드가 나타납니다)이라는 두 가지 개념을 통해이를 달성합니다. 늦은 비록이 답변을

https://www.artima.com/insidejvm/ed2/threadsynchP.html

0

-이 의심을 취소합니다 "내부 JVM"에서 다음과 같은 부분을 읽기

, 그것은 아주 멋지게 (20 장, 스레드 동기화) 여기 설명입니다 질문, 나는 그저 유용하다고 덧붙였다.
여기서 추가 메소드가 호출되는 인스턴스 "이"사용 된 예에서, 비동기 자바 메소드

public void add(int value){ 
synchronized(this){ 
     this.count += value; 
    } 
} 

내부 자바 코드의 동기 블록이다. 동기 인스턴스 메소드는 자신이 속한 오브젝트를 모니터 오브젝트로 사용합니다.
=> 동일한 모니터 오브젝트에서 동기화 된 Java 코드 블록 내에서 하나의 스레드 만 실행할 수 있습니다.