Blog

1 August 2019

자바 뮤텍스 예제

문서의 첫 번째 줄은 뮤텍스는 ressource에 1 및 1 동시 가속만 허용하는 세마포어라고 명시되어 있습니다. 따라서 코드가 동일하게 “보기”하지만 첫 번째 코드가 아닌 이유 : // max 4 people 정적 세마포어 = 새로운 세마포어 (4); 및 제2 코드: // max 1명 정적 세마포세마포 = 새로운 세마포어(1); 다행히 Java는 동기화된 키워드를 통해 초창기부터 스레드 동기화를 지원합니다. 우리는 카운트를 증가 할 때 위의 경주 조건을 해결하기 위해 동기화 를 활용할 수 있습니다 : 위의 튜토리얼CrunchifysemaphoreMutexTutorial.java 때 CrunchifyProducer는 crunchifyList 링크리스트 개체에 스레드 이름을 추가하면 세마포를 신호 할 수 있습니다. 여러 소비자가 있는 경우 어떻게 해야 합니까? 위의 Java 자습서에서 소비자 (생산자가 아님)는 경주 조건을 방지하기 위해 패킷을 읽을 때 버퍼를 잠그어야합니다 (세마포를 획득 할 때는 아님). 아래 예제에서는 모든 것이 동일한 JVM에 있기 때문에 생산자도 목록을 잠그습니다. 뮤텍스는 이론적으로 세마포어와 동일하지만 한 번에 1개의 허용 또는 1개의 스레드만 동기화된 리소스에 액세스할 수 있습니다. Java 다중 스레드 예제에서는 Semaphore 및 Mutex를 사용하여 리소스에 액세스하는 스레드 수를 제한하는 방법을 보여 주습니다. 뮤텍스의 경우 동일한 예제를 취할 것이고 유일한 차이점은 세마포어 오브젝트가 매개 변수 값으로 1로 생성된다는 것입니다. 자바 동시성은 매우 넓은 주제입니다. 사용할 수 있는 수백 개의 자습서 및 예제가 있습니다. 몇 시간 전 나는 자바에서 동시에 여러 스레드를 실행하고 동기화 된 블록의 다른 유형에 대한 몇 가지 자습서를 작성했습니다. 하지만 네이 세마포어는 여전히 다른 스레드 편집에서 잠금을 해제 할 수 있기 때문에 적절한 뮤텍스를하지 않습니다 : 조금 읽은 후, 더 Mutex 클래스가없는 것 같다, 하지만 매우 같은 작동 뭔가 ReentrantLock 참조 https://stackoverflow.com/a/46547469 내부적으로 Java는 동기화를 관리하기 위해 모니터 잠금 또는 내장 잠금이라고도 하는 소위 모니터를 사용합니다.

이 모니터는 개체에 바인딩됩니다(예: 동기화된 메서드를 사용하는 경우 각 메서드는 해당 개체의 동일한 모니터를 공유합니다.) 자바 8 은 위의 예에서와 같이 읽기 및 쓰기 잠금을 지원하는 StampedLock이라는 새로운 종류의 잠금장치와 함께 배송됩니다. ReadWriteLock 스탬프 잠금의 잠금 메서드는 긴 값으로 표시 된 스탬프를 반환 합니다. 이러한 스탬프를 사용하여 잠금을 해제하거나 잠금이 여전히 유효한지 확인할 수 있습니다. 또한 스탬프가 찍힌 잠금은 낙관적 잠금이라는 또 다른 잠금 모드를 지원합니다. 뮤텍스는 이진 세마포와 유사하게 작용하며, 상호 배제를 구현하는 데 사용할 수 있습니다. 두 개의 스레드를 시작하는 다음 코드 스니펫, 한 개체에 동기적으로 액세스하려는 스레드, 즉 카운터와 각 스레드가 1개씩 씩 씩씩하게 증가하는 코드 스니펫을 사용하여 한 스레드는 홀수 숫자만 인쇄하고 다른 스레드만 인쇄합니다. 짝수 숫자를 인쇄합니다. 이 예에서 세마포는 뮤텍스와 동일합니다.

[동일한 출력을 달성하는 방법은 여러 가지가 있지만, 이는 다른 주제입니다( 예: wait() 및 notify()] 볼 수 있듯이 한 번에 하나의 스레드만 실행됩니다. 이것이 뮤텍스의 역할입니다. 1. 스레드가 두 개 이상의 잠금(Mutex)을 획득할 수 있습니까? “Mutex는 일반적으로 두 개 이상의 스레드에서 동시에 실행할 수 없는 재진입 코드 섹션에 대한 액세스를 직렬화하는 데 사용됩니다. mutex 개체는 제어된 섹션에 한 스레드만 허용하므로 해당 섹션에 대한 액세스 권한을 얻으려고 시도하는 다른 스레드는 첫 번째 스레드가 해당 섹션에서 종료될 때까지 기다려야 합니다.” 뮤텍스는 동일한 메서드 또는 코드 블록에서 획득/릴리스 쌍이 발생하지 않으므로 java 동기화 된 블록을 사용하여 표현할 수 없는 구성에 유용할 수 있습니다. 예를 들어 연결된 목록의 노드에서 직접 잠글 때 사용할 수 있습니다. 이렇게 하면 매우 세분화된 잠금을 허용하므로 추가 복잡성과 오버헤드를 희생하여 극단적인 경합의 경우에만 이러한 가치가 있는 잠재적 동시성을 높일 수 있습니다.

Bize Ulaşın