Java에서 모니터 란 무엇입니까?


130

Java의 동시 프로그래밍에서 참조되는 모니터는 무엇입니까?

"모든 개체가 모니터와 연결되어 있음"을 읽으면 무슨 의미입니까?

특별한 물건입니까?


11
+1 이것으로 JVM 레벨에서 모니터가 어떻게 구현되는지 읽었습니다. 새로운 것을 배웠습니다
naikus

@naikus 나는 당신을 공유 세부 정보를 기대합니다 :)
roottraveller

답변:


90

모니터는 객체에 대한 동시 액세스를 제어하는 ​​메커니즘입니다.

이를 통해 다음을 수행 할 수 있습니다.

실 1 :

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

실 2 :

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

스레드 1과 2가 동시에 모니터링 된 (동기화 된) 섹션에 액세스하는 것을 방지합니다. 하나는 시작되고 모니터는 다른 하나는 첫 번째 영역이 끝나기 전에 해당 영역에 액세스하지 못하게합니다.

특별한 물건이 아닙니다. 클래스 계층 구조 루트에 배치 된 동기화 메커니즘 java.lang.Object입니다.

이 또한 waitnotify도 다른 스레드간에 통신 객체의 모니터를 사용하는 방법.


1
동기화 된 메소드를 만들 때 해당 객체의 메소드에 잠금 (모니터)을 정의한다고 말할 수 있습니까?
xdevel2000

28
음, 정확히는 아닙니다. 각 객체에는 다른 것에 관계없이 자동으로 연결된 모니터 (뮤텍스)가 있습니다. 동기화 된 메서드를 선언하면 해당 메서드의 실행이 시작되기 전에 런타임이 개체의 모니터에서 잠금을 얻어야한다는 것을 선언하는 것입니다 (제어가 호출 코드로 돌아 가기 전에 잠금을 해제해야 함).
Andrzej Doyle

31
그리고 @Pablo-메소드의 모니터와 같은 것은 없습니다. 모니터는 대부분의 메소드를위한 엔 클로징 인스턴스 또는 Class정적 메소드 의 해당 오브젝트 인 오브젝트에 대해서만 존재 합니다. 이미 동기화 된 method1 ()이 있고 method2 ()가 동기화 된 것으로 선언 한 경우 새 모니터가 작성되지 않으며 실제로 동일한 오브젝트에서 두 메소드를 호출하면 동일한 모니터를 잠그려고 시도합니다. 이것은 종종 새로운 이민자를 잡습니다.
Andrzej Doyle

1
@Andrzej : 모든 객체에는 하나의 모니터가 연결되어 있습니다. 그런 다음 많은 동기화 된 메소드를 가질 수 있습니다. 해당 메소드가있을 때마다 스레드 호출은 동기화 작업을 수행하는 모니터를 얻습니다.
xdevel2000

1
스레드 1에서 동기화 된 블록을 호출하는 데 사용되는 객체를 다른 스레드 (스레드 2)에서 다시 사용하여 일반 메소드 (동기화되지 않음)를 동시에 호출 할 수 있습니까?

27

모니터는 잠금대기 세트를 모두 갖는 엔티티입니다 . Java에서는 모든 Object것이 모니터 역할을 할 수 있습니다.

Java에서 모니터가 작동하는 방법에 대한 자세한 설명은 Java 동시 프로그래밍모니터 역학 섹션을 읽는 것이 좋습니다 (앞의 링크는 Google 도서에 미리보기를 표시하고 해당 섹션을 읽을 수 있음).


"모니터는 엔티티입니다."라고 말했듯이 모니터는 잠금 및 대기 세트를 소유 / 추적하는 내부 객체 / 상태를 의미합니까? 그렇지 않다면 여기에서 자세한 엔티티를 제발 할 수 있습니까? 기본적으로 java doc이 Wakes up all threads that are waiting on this object's monitor. notifyall ()에 대해 말할 때 , 내가 얻는 것은 객체가 모든 스레드가 잠금을 기다리는 것을 유지하고 (내부 엔티티 / 객체의 도움으로) 내부 엔티티 / 객체를 모니터라고합니다.
user3198603

가장 유용한 답변. @JRL 감사합니다.
gravetii

나에게 "이 페이지에 대한 미리보기가 없습니다."라고 말합니다.
opncow

9
  1. 모니터는 Java 언어에만 국한되지 않는 개념 / 메커니즘입니다.
  2. "동시 프로그래밍에서 모니터는 둘 이상의 스레드가 안전하게 사용하도록 설계된 객체 또는 모듈입니다";
  3. 모든 독자가 알고 있듯이 Java의 모든 객체는 java.lang.Object의 하위 클래스입니다. 자바 사람들은 자바 프로그래머가 모든 객체를 모니터로 사용할 수있는 기능과 특징을 갖도록 java.lang.Object를 만들었습니다. 예를 들어, 모든 오브젝트에는 대기 큐, 재입국 큐 및 대기 및 통지 메소드가 있으며이를 모니터로 만듭니다.
  4. 모니터에 대한 정보는 여기를 참조하십시오 .

4

Java 언어 및 런타임 시스템은 모니터 사용을 통한 스레드 동기화를 지원합니다.
모니터는 특정 데이터 항목 (조건 변수)과 연관되며 해당 데이터에 대한 잠금 기능을합니다. 스레드가 일부 데이터 항목에 대한 모니터를 보유하면 다른 스레드가 잠기 며 데이터를 검사하거나 수정할 수 없습니다.



2

모니터는 스레드가 상호 배제와 특정 조건이 충족 될 때까지 대기 (차단) 할 수있는 동기화 구성입니다.

모니터에는 다른 스레드의 상태가 충족되었음을 알리는 메커니즘도 있습니다. 잠금 및 대기 세트를 모두 보유하는 엔티티입니다. Java에서 모든 Object는 모니터 역할을 할 수 있습니다.

JVM (Java Virtual Machine)에서 모든 오브젝트 및 클래스는 논리적으로 모니터와 연관됩니다. 모니터의 상호 배제 기능을 구현하기 위해 잠금 (뮤텍스라고도 함)이 각 오브젝트 및 클래스와 연관됩니다. 이것을 운영 체제 용어로 세마포라고하며 뮤텍스는 이진 세마포입니다.

자세한 내용은 링크를 확인하십시오


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