Java에서 개체 모니터의 의미는 무엇입니까? 이 단어를 사용하는 이유는 무엇입니까?


87

Java 스레드에 대한 기사를 읽을 때 "현재 스레드는이 개체 모니터의 소유자입니다"라는 표현을 자주 보게됩니다. 나는 의미를 얻습니다. 스레드는 객체에 대해 작동 할 권리를 얻습니다. 하지만 왜 우리가 "객체의 잠금"대신 "객체의 모니터"라는 문구를 사용하는지 의아해합니다.

간단히 말해 '모니터'라는 단어의 의미를 모르겠습니다. 질문은 이상하고 간단 할 수 있습니다. 하지만 누구든지이 문제를 해결할 수 있기를 바랍니다. 3ks


1
+1 @ulmangt는 실제로 귀하의 질문에 답할 수있는 유일한 사람입니다. Hoare가 1974 년에 다시 호출 한 것이기 때문에 "모니터"라고 부릅니다.
Solomon Slow

답변:


52

하지만 왜 "객체의 잠금"이라는 단어를 "객체의 모니터"라는 뜻으로 사용하는지 궁금합니다.

이 컨텍스트에서 사용되는 "모니터"라는 용어를 설명하는 링크는 ulmangt의 답변을 참조하십시오. 참고 :

"모니터는 Per Brinch Hansen과 CAR Hoare에 의해 발명되었으며 Brinch Hansen의 Concurrent Pascal 언어로 처음 구현되었습니다."

(출처 : Wikipedia )

"잠금"대신 "모니터"라는 용어를 사용하는 이유는 무엇입니까? 엄밀히 말해서, 용어는 다른 의미를 가지고 있습니다. 특히 원래 의도했던 방식으로 사용하는 경우 특히 그렇습니다.

  • "잠금"은 특정 잠금 속성을 유지하는 프리미티브를 획득하고 해제하는 것입니다. 예 : 독점 사용 또는 단일 작성자 / 다중 판독기.

  • "모니터"는 주어진 시간에 주어진 코드 섹션 (또는 섹션)을 하나의 스레드 만 실행할 수 있도록하는 메커니즘입니다. 이는 잠금 (및 스레드가 조건이 충족되는 다른 스레드에 대한 알림을 기다리거나 보낼 수 있도록 허용하는 "조건 변수")을 사용하여 구현할 수 있지만 단순한 잠금 이상입니다. 실제로 Java의 경우 모니터에서 사용하는 실제 잠금에 직접 액세스 할 수 없습니다. (단지 "Object.lock ()"이라고 말하면 다른 스레드가이를 획득하지 못하도록 할 수 없습니다 Lock. Java 인스턴스에서 할 수있는 것처럼 .)

요컨대, 현학적 인 "모니터"가 실제로 Java가 제공하는 것을 특성화하는 "잠금"보다 나은 용어입니다. 그러나 실제로 두 용어는 거의 같은 의미로 사용됩니다.



10

Java Virtual Machine 내부에서 인용

JVM (Java Virtual Machine)의 스레드는 모니터 영역의 시작에 도달 할 때 잠금을 요청합니다. Java에는 동기화 된 명령문과 동기화 된 메소드라는 두 종류의 모니터 영역이 있습니다.

감시 장치

모니터는 한 번에 하나의 스레드로만 점유 할 수있는 하나의 특별한 공간이있는 건물과 같습니다. 방에는 일반적으로 일부 데이터가 포함되어 있습니다. 스레드가이 방에 들어올 때부터 나갈 때까지 방에있는 모든 데이터에 독점적으로 액세스 할 수 있습니다. 모니터 건물에 들어가는 것을 "모니터에 들어가기"라고합니다. 건물 내부의 특별실에 들어가는 것을 "모니터 획득"이라고합니다. 방을 점유하는 것을 "모니터 소유"라고하고 방을 나가는 것을 "모니터 해제"라고합니다. 건물 전체를 나가는 것을 "모니터 나가기"라고합니다.

모니터는 데이터 비트와 연관 ​​될뿐 아니라 하나 이상의 코드 비트와 연관되며이 책에서는 모니터 영역이라고합니다.

앞서 언급했듯이이 언어는 프로그램에서 모니터 영역을 식별하는 두 가지 기본 제공 방법 인 동기화 된 명령문과 동기화 된 메소드를 제공합니다. 동기화의 상호 배제 측면을 구현하는이 두 메커니즘은 JVM (Java Virtual Machine)의 명령어 세트에서 지원됩니다.

자물쇠

모니터의 상호 배제 기능을 구현하기 위해 Java 가상 머신은 잠금 (뮤텍스라고도 함)을 각 객체 및 클래스와 연관시킵니다. 잠금은 한 번에 하나의 스레드 만 "소유"할 수있는 권한과 같습니다.

단일 스레드는 동일한 객체를 여러 번 잠글 수 있습니다. 각 객체에 대해 Java 가상 머신은 객체가 잠긴 횟수를 유지합니다. 잠금 해제 된 개체의 개수는 0입니다. 스레드가 처음으로 잠금을 획득하면 카운트가 다시 1로 증가합니다. 스레드가 동일한 객체에 대한 잠금을 획득 할 때마다 카운트가 다시 증가합니다.


6

synchronized주변 의 블록 object은 개체에 대한 잠금을 제어하는 ​​모니터입니다. 여기에 예

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

4

이 질문에 답하기는 늦었지만 유용 할 경우 추가하려고 생각했습니다.
다음은 동기화되지 않은 Java 메서드 내부의 동기화 된 Java 코드 블록입니다.

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

예제에서 "this"가 사용되며 이는 add 메소드가 호출되는 인스턴스입니다. 동기화 된 인스턴스 메서드는 자신이 속한 개체를 모니터 개체로 사용합니다.
=> 동일한 모니터 개체에서 동기화 된 Java 코드 블록 내에서 하나의 스레드 만 실행할 수 있습니다.


3

Java Virtual Machine은 모니터를 사용하여 멀티 스레딩을 지원합니다. 모니터는 스레드를 실행하는 동안 상호 배제 ( '잠금'이 나타나는 곳)와 스레드 간 통신 수단으로서의 조정 (여기에서 객체의 대기 및 알림 방법이 나타나는 곳)이라는 두 가지 개념을 통해이를 달성합니다.

"Inside JVM"에서 다음 부분을 읽으면이 의심이 사라질 것입니다. 여기에서 매우 잘 설명되어 있습니까 (20 장, 스레드 동기화)-

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.