>Java >java지도 시간 >Java에서 다중 스레드 동기화를 이해하는 방법

Java에서 다중 스레드 동기화를 이해하는 방법

WBOY
WBOY앞으로
2023-05-01 11:01:06677검색

1. 선착순 스레드

더러운 예를 들어보겠습니다. 레스토랑의 화장실은 매우 작아서 한 사람도 겨우 수용할 수 있습니다. 방해가 되지 않도록 화장실을 이용하는 사람은 화장실에 들어갈 때 문을 잠가야 합니다. 우리는 화장실을 공유 자원으로 생각할 수 있고, 화장실에 가야 하는 많은 사람들은 다중 스레드로 간주할 수 있습니다. 현재 화장실이 비어 있으면 다른 사람들은 그 사람이 화장실 사용을 마치고 문을 열고 나올 때까지 기다려야 합니다. 이는 여러 스레드가 리소스를 공유할 때 선착순으로 정렬되어야 하는 것과 같습니다.

누군가가 말했습니다: 이 문이 없으면 어떻게 될까요? 두 개의 스레드가 서로 경쟁하고, 먼저 승리하는 사람이 먼저 작업할 수 있다는 것은 얼마나 멋진 일입니까? 그러나 화장실에 문이 없고 사람들이 함께 화장실로 달려가면 필연적으로 분쟁이 발생하고 정상적인 화장실 사용 단계가 중단되며 예상치 못한 결과가 발생할 가능성이 있다는 것을 우리는 알고 있습니다. 엉뚱한 곳에 억지로 비료를 뿌리게 될 수도 있는데...

혼자 화장실에 들어가는 사람도 방해받지 않고, 사고가 나지 않고 원활하게 배변을 마칠 수 있는 것이 바로 이 문 덕분이다. 즉, 화장실에 갈 때 선착순으로 가야 한다는 뜻이다.

그러면 Java 다중 스레드 프로그램에서 여러 스레드가 동일한 리소스를 놓고 경쟁할 때 이들이 "싸움"하지 않도록 어떻게 보장할 수 있습니까? 어떤 사람들은 동기화 메커니즘을 사용한다고 말합니다. 맞습니다. 위의 예는 첫 번째 사람이 화장실에 가기 시작하면 두 번째 사람이 배변 과정을 시작하기 전에 첫 번째 사람이 끝날 때까지 기다려야 하는 일반적인 동기화 사례입니다. 스레드가 특정 프로세스에 들어가면 다음 스레드가 프로세스를 시작하기 전에 정상적인 반환을 기다리고 프로세스를 종료해야 합니다.

여기서 가장 중요한 것은 화장실 문입니다. 실제로 화장실 문은 자원 잠금 장치 역할을 합니다. 화장실을 사용하는 사람이 문을 잠그면 잠금 장치를 획득한 것과 같고, 잠금 장치를 열고 나오면 해제하는 것과 같습니다. 잠그다.

즉, 멀티스레드 스레드 동기화 메커니즘은 실제로 잠금 개념에 의해 제어됩니다. 그렇다면 잠금은 Java 프로그램에 어떻게 반영됩니까?

JVM 관점에서 잠금 개념을 살펴보겠습니다.

Java 프로그램 런타임 환경에서 JVM은 두 가지 유형의 스레드가 공유하는 데이터를 조정해야 합니다.

1) 힙에 저장된 인스턴스 변수

2) 메소드 영역에 저장되는 클래스 변수

이 두 가지 데이터는 모든 스레드에서 공유됩니다. (프로그램은 Java 스택에 저장된 데이터를 조정할 필요가 없습니다. 이러한 데이터는 스택을 소유하는 스레드에만 해당되기 때문입니다.)

Java 가상 머신에서 각 개체와 클래스는 연결된 모니터와 논리적으로 연결됩니다.

객체의 경우 연결된 모니터가 객체의 인스턴스 변수를 보호합니다.

클래스의 경우 모니터는 클래스의 클래스 변수를 보호합니다. (객체에 인스턴스 변수가 없거나 클래스에 변수가 없으면 연관된 모니터는 아무것도 모니터링하지 않습니다.)

모니터의 독점 모니터링 기능을 구현하기 위해 Java 가상 머신은 각 객체 및 클래스에 잠금을 연결합니다. 언제든지 하나의 스레드만 가질 수 있는 권한을 나타냅니다. 스레드는 인스턴스 변수나 클래스 변수에 액세스하기 위해 잠금이 필요하지 않습니다.

그러나 스레드가 잠금을 획득하면 잠금을 해제하기 전에 다른 스레드가 동일한 데이터에 대한 잠금을 획득할 수 없습니다. (객체를 잠그는 것은 객체와 관련된 모니터를 얻기 위함입니다.)

클래스 잠금은 실제로 객체 잠금을 사용하여 구현됩니다. 가상 머신은 클래스 파일을 로드할 때 java.lang.Class 클래스의 인스턴스를 생성합니다. 객체가 잠길 때 실제로 잠긴 것은 해당 클래스의 Class 객체입니다.

스레드는 동일한 객체를 여러 번 잠글 수 있습니다. 각 개체에 대해 JVM(Java Virtual Machine)은 스레드가 개체를 얻을 때마다 카운터가 1씩 증가하고 해제될 때마다 1씩 감소합니다. 카운터 값이 0에 도달하면 잠금이 해제됩니다. 완전히 출시되었습니다.

Java 프로그래머는 스스로를 잠글 필요가 없으며 객체 잠금은 Java 가상 머신에서 내부적으로 사용됩니다.

자바 프로그램에서는 모니터링 영역을 표시하기 위해 동기화된 블록이나 동기화된 메소드만 사용하면 됩니다. 모니터링 영역에 들어갈 때마다 JVM(Java Virtual Machine)은 자동으로 해당 객체나 클래스를 잠급니다.

위 내용은 Java에서 다중 스레드 동기화를 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제