>  기사  >  Java  >  모니터는 무슨 뜻인가요? Java 모니터 소개

모니터는 무슨 뜻인가요? Java 모니터 소개

不言
不言원래의
2018-09-17 15:12:1867421검색


모니터는 무슨 뜻인가요? Java 모니터 소개

이 기사에서는 모니터에 대한 내용을 제공합니다(튜브 쳉은 무엇을 하나요) 평균? Java에 Monitor를 도입한 것은 참고할만한 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

모니터의 개념

모니터는 영어로 "모니터"로도 번역되는 경우가 많습니다. 모니터를 "모니터"로 번역할지 "모니터"로 번역할지 여부는 상대적으로 모호합니다. 중국어 번역으로는 모니터에 대한 직관적인 설명이 불가능합니다.
이 기사 "운영 체제 동기화 기본 요소"에서는 프로세스/스레드 간의 동기화에 직면할 때 운영 체제에서 지원하는 몇 가지 동기화 기본 요소를 소개합니다. 그 중 세마포어 세마포어와 뮤텍스 뮤텍스가 가장 중요한 동기화 기본 요소입니다.
동시성 제어를 위해 기본 뮤텍스를 사용할 때 프로그래머는 뮤텍스의 하향 및 상향 작업을 제어할 때 매우 주의해야 합니다. 그렇지 않으면 쉽게 교착 상태 및 기타 문제가 발생할 수 있습니다. 올바른 동시 프로그램을 보다 쉽게 ​​작성할 수 있도록 뮤텍스 및 세마포어를 기반으로 하는 상위 수준의 동기화 기본 모니터가 제안되었지만 실제로는 운영 체제 자체가 모니터 메커니즘을 지원하지 않는다는 점에 유의해야 합니다. 모니터를 사용하려면 먼저 언어 자체가 모니터 프리미티브를 지원하는지 확인해야 합니다. 예를 들어 C 언어는 모니터를 지원하지 않으며, Java 언어는 모니터를 지원합니다.
일반적인 모니터 구현 모드는 프로그래밍 언어가 구문에 구문 설탕을 제공한다는 것이며, 모니터 메커니즘을 구현하는 방법은 Java가 수행하는 작업입니다.

모니터의 중요한 특징은 동시에 하나의 프로세스/스레드만이 모니터에 정의된 임계 섹션에 들어갈 수 있다는 것입니다. 이를 통해 모니터는 상호 배제를 달성할 수 있습니다. 그러나 상호 배제만으로는 충분하지 않습니다. 모니터의 중요 섹션에 들어갈 수 없는 프로세스/스레드는 필요할 때 차단하고 깨워야 합니다. 분명히 동기화 도구로서 모니터는 프로세스/스레드 상태를 관리하기 위한 메커니즘도 제공해야 합니다. 우리가 개인적으로 변수를 조작하고 프로세스/스레드를 차단하고 깨워야 하기 때문에 세마포어와 뮤텍스가 프로그래밍에서 오류가 발생하기 쉽다고 생각하는 이유를 생각해 보세요. 모니터 메커니즘을 "상위 레벨 프리미티브"라고 부르는 이유는 필연적으로 이러한 메커니즘을 외부로부터 보호하고 이러한 메커니즘을 내부적으로 구현해야 모니터를 사용하는 사람들이 간단하고 사용하기 쉬운 인터페이스를 볼 수 있기 때문입니다. .

모니터 기본 요소

모니터 메커니즘에는 여러 요소가 협력해야 합니다. 🎜#

  1. monitor 객체 및 잠금

  2. 모니터 객체에 정의된 조건 변수 및 대기 및 신호 작업.

  3. 모니터 메커니즘을 사용하는 주요 목적은 임계 섹션에 들어갈 수 없는 프로세스/스레드를 차단하기 위해 임계 섹션에 대한 진입을 상호 배제하는 것입니다. , 모니터 개체는 기본적으로 기본 기본 뮤텍스인 모니터를 기반으로 하기 때문에 동시에 차단된 스레드를 저장하기 위해 목록과 같은 해당 데이터 구조를 내부에 갖습니다. 객체는 뮤텍스 기반 잠금도 유지해야 합니다.

    또한 적절한 시간에 프로세스/스레드를 차단하고 깨울 수 있으려면 조건 변수를 도입해야 합니다. 이 조건 변수는 "적절한 시간"이 언제인지 결정하는 데 사용됩니다. 조건은 프로그램 코드의 논리에서 나올 수도 있고 모니터 개체 내부에 있을 수도 있습니다. 즉, 프로그래머는 조건 변수 정의에 있어 큰 자율성을 갖습니다. 그러나 모니터 개체는 내부 데이터 구조를 사용하여 차단된 대기열을 저장하므로 스레드가 차단 상태에 들어갔다가 나중에 깨어날 수 있도록 두 개의 외부 API, 즉 대기 및 알림도 제공해야 합니다.

  4. Java 언어의 모니터 지원

monitor은 운영 체제에서 제안한 고급 기본 요소이지만 특정 구현 모드는 프로그래밍 언어마다 다를 수 있습니다. 다음은 Java의 모니터를 예로 들어 Java에서 모니터가 어떻게 구현되는지 설명합니다.

중요 섹션 설명

Java에서는 동기화 키워드를 사용하여 아래와 같이 인스턴스 메서드, 클래스 메서드 및 코드 블록을 수정할 수 있습니다.

/**
 * @author beanlam
 * @version 1.0
 * @date 2018/9/12
 */
public class Monitor {

    private Object ANOTHER_LOCK = new Object();

    private synchronized void fun1() {
    }

    public static synchronized void fun2() {
    }

    public void fun3() {
        synchronized (this) {
        }
    }

    public void fun4() {
        synchronized (ANOTHER_LOCK) {
        }
    }
}
# 🎜🎜#synchronized 키워드로 수정된 메소드와 코드 블록은 모니터 메커니즘의 중요한 부분입니다.

monitor object

위의 동기화 키워드를 사용할 때 동기화(this) 또는 동기화(ANOTHER_LOCK)와 같이 연결할 개체를 지정해야 하는 경우가 많습니다. 연관 객체는 실제로 this입니다. 클래스 메소드인 경우 연관된 객체는 this.class입니다. 즉, 동기화는 개체와 연결되어야 하며 이 개체는 모니터 개체입니다.
모니터 메커니즘에서 모니터 개체는 뮤텍스를 유지하고 대기/신호 API를 정의하여 스레드 차단 및 깨우기를 관리하는 역할을 합니다.
Java 언어의 java.lang.Object 클래스는 이 요구 사항을 충족하는 개체입니다. 모든 Java 개체는 모니터 메커니즘의 모니터 개체로 사용될 수 있습니다.
Java 객체는 메모리에 저장되며 객체 헤더, 인스턴스 데이터 및 정렬 채우기라는 세 부분으로 나뉩니다. 객체 헤더에는 잠금 식별자가 동시에 저장되며 java.lang.Object 클래스는 wait( ), inform(), informAll() 메소드의 경우, 이러한 메소드의 구체적인 구현은 C++ 기반 JVM 내에서 구현되는 메커니즘 세트인 ObjectMonitor 모드라는 구현에 의존합니다.

모니터는 무슨 뜻인가요? Java 모니터 소개

스레드가 개체의 잠금을 획득해야 할 경우 해당 스레드는 EntrySet에 배치되고 대기합니다. 스레드가 잠금을 획득하면 현재 잠금의 소유자가 됩니다. 프로그램 논리에 따라 잠금을 획득한 스레드에 일부 외부 조건이 부족하여 계속할 수 없는 경우(예: 생산자가 대기열이 가득 찼음을 발견하거나 소비자가 대기열이 비어 있음을 발견한 경우) 스레드는 다음을 전송할 수 있습니다. 대기 메소드를 호출하여 잠금을 해제하고 대기 설정을 입력하면 이때 다른 스레드가 잠금을 획득하고 다른 작업을 수행할 수 있으므로 이전에 설정되지 않은 외부 조건이 설정됩니다. 이전에 차단된 스레드가 EntrySet에 다시 들어가 잠금을 위해 경쟁할 수 있습니다. 이 외부 조건을 모니터 메커니즘에서는 조건 변수라고 합니다.

synchronized 키워드

synchronized 키워드는 개발자가 다중 스레드 동기화를 쉽게 수행할 수 있도록 구문 수준에서 Java에서 사용하는 중요한 도구입니다. 동기화된 메소드에 의해 수정된 메소드나 코드 블록을 입력하려면 먼저 동기화된 키워드에 바인딩된 객체의 객체 잠금을 획득해야 합니다. 이 잠금은 또한 다른 스레드가 이 잠금과 관련된 다른 동기화된 코드 영역에 진입하는 것을 제한합니다.

인터넷의 많은 기사와 정보는 동기화의 원리를 분석할 때 기본적으로 동기화가 모니터 메커니즘을 기반으로 구현된다고 말하지만 명확하게 설명하는 기사는 거의 없고 모두 모호합니다.
앞서 언급한 모니터의 기본 요소를 참고하여, 동기화가 모니터 메커니즘을 기반으로 구현된다면 해당 요소는 무엇인가요?
Critical 섹션이 있어야 합니다. 여기서 Critical 섹션은 개체 헤더 뮤텍스의 P 또는 V 작업이라고 생각하면 됩니다.
그럼 모니터 개체는 어느 것에 해당합니까? 뮤텍스? 즉, 실제 모니터 개체를 찾을 수 없습니다.
그래서 "동기화는 모니터 메커니즘을 기반으로 구현됩니다"라는 진술은 정확하지 않고 모호하다고 생각합니다.
Java에서 제공하는 모니터 메커니즘은 실제로 개체, 동기화 및 기타 요소의 협력으로 구성됩니다. 외부 조건 변수도 구성 요소입니다. JVM의 기본 ObjectMonitor는 모니터 메커니즘 구현을 지원하는 데 사용되는 공통 모드일 뿐이지만 대부분의 기사에서는 ObjectMonitor를 모니터 메커니즘으로 직접 간주합니다.
이렇게 이해해야 한다고 생각합니다. 모니터에 대한 Java의 지원은 메커니즘의 세분성에서 개발자에게 제공됩니다. 즉, 개발자는 말할 객체의 대기/알림과 같은 요소와 함께 동기화된 키워드를 사용해야 합니다. 모니터 메커니즘은 생산자-소비자 문제를 해결하는 데 사용됩니다.



위 내용은 모니터는 무슨 뜻인가요? Java 모니터 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.