programing

자바어로 물체의 모니터는 무슨 뜻입니까?왜 이 단어를 사용하는가?

sourcetip 2023. 1. 20. 17:39
반응형

자바어로 물체의 모니터는 무슨 뜻입니까?왜 이 단어를 사용하는가?

Java 스레드에 대한 기사를 읽을 때 "현재 스레드는 이 개체의 모니터 소유자"라는 표현을 자주 볼 수 있습니다.나는 그 뜻을 이해한다: 쓰레드는 그 물체에 대한 조작권을 갖는다.그런데 왜 '물건의 잠김' 대신 '물건의 모니터'라는 문구를 사용하는지 모르겠다.

간단히 말해, 나는 '모니터'라는 단어의 의미를 모른다. 질문은 이상하고 간단할 수 있다.하지만 나는 누군가가 그것을 해결하도록 도울 수 있기를 바란다.3ks

그런데 왜 "객체의 잠김"이라는 단어 뒤에 "객체의 모니터"라는 단어를 사용하는지 모르겠다.

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

"모니터는 Per Brinch Hansen과 C에 의해 발명되었습니다.A. R. Hoare는 브린치 한센의 동시 파스칼 언어로 처음 구현되었습니다."

(출처:위키피디아)

왜 "잠금"이 아닌 "모니터"라는 용어를 사용하는가?엄밀히 말하면, 그 용어는 다른 것을 의미합니다.특히 원래 사용하던 방식대로 사용한다면 더욱 그렇습니다.

  • "잠금"은 특정 잠금 속성을 유지하는 획득 및 해제 프리미티브(예: 전용 또는 단일 쓰기/복수 판독기)가 있는 것입니다.

  • "모니터"는 한 번에 하나의 스레드만 특정 코드 섹션을 실행할 수 있도록 하는 메커니즘입니다.이는 잠금(및 조건이 충족되는 다른 스레드에 대해 스레드가 대기하거나 알림을 보낼 수 있도록 하는 "조건 변수")을 사용하여 구현할 수 있지만, 단순히 잠금이 아닙니다.자바 사용할 수 있습니다. ('Object.'은 'Object.lock()'과 같이 사용할 수 있습니다.)Lock (인스턴스).

즉, 현학적인 관점에서 보면, 실제로는 Java가 제공하는 것을 특징짓는 「Lock」보다 「monitor」가 더 좋은 용어입니다.그러나 실제로는 두 용어가 거의 서로 바꿔서 사용됩니다.

모니터는 단순히 멀티스레드 환경에서 안전하게 사용할 수 있는 메서드를 가진 오브젝트의 용어입니다.

Wikipedia의 모니터에 관한 훌륭한 기사가 있습니다.

http://en.wikipedia.org/wiki/Monitor_(synchronization)

아래로 스크롤하면 Java에 대한 섹션도 나타납니다.

Java 가상 머신 내부에서 인용

Java 가상 시스템의 스레드는 모니터 영역의 시작 부분에 도착하면 잠금을 요청합니다.Java에서는 Synchronized 스테이트먼트와 Synchronized 메서드의 두 가지 모니터 영역이 있습니다.

모니터

모니터는 한 번에 한 개의 실만 점유할 수 있는 하나의 특별한 방이 있는 건물과 같다.이 방에는 보통 몇 가지 데이터가 들어 있습니다.스레드가 이 룸에 들어온 시점부터 나갈 때까지 룸의 모든 데이터에 독점적으로 액세스할 수 있습니다.모니터 빌딩에 들어가는 것을 「모니터에 들어가는 것」이라고 부릅니다.건물 안에 있는 특별한 방에 들어가는 것을 "모니터 획득"이라고 합니다.방을 점유하는 것을 "모니터 소유"라고 하며, 방을 떠나는 것을 "모니터 해방"이라고 합니다.건물 전체를 떠나는 것을 "모니터 밖으로 나가는 것"이라고 합니다.

모니터는 데이터의 비트에 관련지어지는 것 외에 1개 이상의 코드에 관련지어져 있습니다.이 책에서는 이를 모니터 영역이라고 부릅니다.

앞에서 설명한 바와 같이 이 언어에는 프로그램에서 모니터 영역을 식별하는 두 가지 방법(동기화된 문과 동기화된 메서드)이 포함되어 있습니다.동기화의 상호 제외 측면을 구현하는 이 두 메커니즘은 Java 가상 시스템의 명령 집합에서 지원됩니다.

잠그다

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

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

A synchronized에 둘러쌓다object이 모니터는 오브젝트의 잠금을 제어합니다.예를 들어 보겠습니다.

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

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

"Inside JVM"에서 다음 부분을 읽으면 이 의문을 해소할 수 있습니다.여기서 (20장, 스레드 동기화)에 대해 자세히 설명하겠습니다.

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

이 질문에 답하는 것은 늦었지만, 케이스에 넣기만 하면 편리하다고 생각했습니다.
이것은 동기화되지 않은 Java 메서드 내의 동기화된 Java 코드 블록입니다.

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

이 예에서는 추가 메서드가 호출되는 인스턴스인 this가 사용됩니다.동기 인스턴스 메서드는 소속된 개체를 모니터 개체로 사용합니다.
=> 동일한 모니터 오브젝트에서 동기화된 Java 코드 블록 내에서 실행할 수 있는 스레드는 1개뿐입니다.

언급URL : https://stackoverflow.com/questions/9848616/whats-the-meaning-of-an-objects-monitor-in-java-why-use-this-word

반응형