"안녕, 아미고!"

"이전 수업에서 '뮤텍스'와 '모니터'라는 단어를 가끔 사용했는데 이제 그 의미를 설명할 차례입니다."

"나는 모두 귀입니다."

" 뮤텍스 는 스레드/프로세스를 동기화하기 위한 특수 개체입니다. 두 가지 가능한 상태가 있습니다: 사용 중 및 사용 중입니다. 간단히 말해서, 뮤텍스는 사용 중(true) 및 사용 가능(false)의 두 가지 값을 가질 수 있는 부울 변수입니다."

"스레드가 개체의 소유권을 가져오려고 하면 개체의 뮤텍스를 사용 중인 것으로 표시합니다. 개체 작업이 끝나면 뮤텍스를 사용 가능한 것으로 표시합니다."

"즉, 뮤텍스는 문에 있는 '바쁨/한가함' 표시와 같은 것입니까?"

"예. 그리고 그러한 뮤텍스는 Java의 모든 개체와 연결되어 있습니다. Java 시스템만이 뮤텍스에 직접 액세스할 수 있습니다. 프로그래머에게는 숨겨져 있습니다."

"그럼 어떻게 쓰죠?"

"자바에서는 모니터를 통해 뮤텍스로 작업할 수 있습니다."

"모니터는 뮤텍스 위에 쌓인 특수 메커니즘(코드 조각)입니다. 뮤텍스와의 적절한 상호 작용을 보장합니다. 개체를 사용 중인 것으로 표시하는 것만으로는 충분하지 않습니다. 다른 스레드가 시도하지 않도록 하는 것이 여전히 필요합니다. 바쁜 개체를 사용하십시오."

"Java에서 모니터는 동기화된 키워드를 사용하여 구현됩니다."

"동기화된 블록을 작성할 때 Java 컴파일러는 이를 다음 세 가지 코드로 대체합니다."

1) 동기화된 블록의 시작 부분에 뮤텍스를 사용 중인 것으로 표시하는 코드가 추가됩니다.

2)  동기화된 블록의 끝에 뮤텍스를 무료로 표시하는 코드가 추가됩니다.

3)  동기화된 블록 전에 뮤텍스가 사용 중인 경우 뮤텍스가 해제될 때까지 스레드를 대기시키는 코드가 추가됩니다.

"대략 작동 방식은 다음과 같습니다."

암호 작동 방식 설명
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;

뮤텍스가 사용 중인 동안 스레드는 휴면합니다
(뮤텍스가 해제되면 루프를 종료합니다). 뮤텍스를 사용 중으로 표시합니다.

doTask() 실행;

뮤텍스를 무료로 표시

"실제로는 논리가 다르고 더 복잡합니다. 하지만 이것들은 세부 사항일 뿐입니다."

"자세한 내용을 알 수 있을까요?"

"올바르게 사용하는 방법을 배우기 전에는 세부 사항에 얽힐 필요가 없습니다."

"몇 단계 전에 전이 화살표가 있는 모든 스레드 상태 목록과 이 상태에 영향을 미치는 메서드 목록을 줬습니다. 많이 기억하시나요?"

"아니요. 그냥 너무 빨리 잊어버려서..."

"연습을 적게 할수록 이론의 혜택도 줄어듭니다."

"레벨 40이 되면 이 모든 것을 사용하는 방법을 배우게 될 것입니다. 이 모든 것이 실제로 어떻게 작동하는지 설명하겠습니다. 그동안 모든 것을 올바르게 사용하는 방법을 배우십시오. 알았습니까?"

"네, 고마워요, 엘리."