[java] Java에서 뮤텍스와 세마포어는 무엇입니까? 주요 차이점은 무엇입니까?

Java에서 뮤텍스와 세마포어는 무엇입니까? 주요 차이점은 무엇입니까?



답변

세마포는 계산할 수 있지만 뮤텍스는 1까지만 계산할 수 있습니다.

클라이언트 연결을 허용하는 스레드가 실행 중이라고 가정합니다. 이 스레드는 10 개의 클라이언트를 동시에 처리 할 수 ​​있습니다. 그런 다음 각 새 클라이언트는 10에 도달 할 때까지 세마포를 설정합니다. 세마포에 10 개의 플래그가 있으면 스레드가 새 연결을 수락하지 않습니다.

뮤텍스는 일반적으로 물건을 보호하는 데 사용됩니다. 10 명의 클라이언트가 시스템의 여러 부분에 액세스 할 수 있다고 가정합니다. 그런 다음 뮤텍스를 사용하여 시스템의 일부를 보호 할 수 있으므로 한 클라이언트가 해당 하위 시스템에 연결되면 다른 사람이 액세스 할 수 없습니다. 이 목적으로도 Semaphore를 사용할 수 있습니다. 뮤텍스는 “Mutual Exclusion Semaphore” 입니다.


답변

불행히도 모든 사람들이 세마포어와 뮤텍스 사이의 가장 중요한 차이점을 놓쳤습니다. ” 소유권 ” 의 개념 .

세마포어에는 소유권 개념이 없습니다. 이는 모든 스레드가 세마포어를 해제 할 수 있음을 의미합니다 (이는 자체적으로 많은 문제를 일으킬 수 있지만 “사망 감지”에 도움이 될 수 있음). 뮤텍스에는 소유권 개념이있는 반면 (즉, 획득 한 뮤텍스 만 해제 할 수 있습니다).
동시 시스템의 안전한 프로그래밍을 위해서는 소유권이 매우 중요합니다. 항상 세마포어보다 뮤텍스를 사용하는 것이 좋습니다 (하지만 성능에 영향이 있음).

뮤텍스는 또한 우선 순위 상속 (우선 순위 반전 문제에 도움이 될 수 있음)과 재귀 (한 가지 유형의 교착 상태 제거)를 지원할 수 있습니다.

또한 “바이너리”세마포어와 “카운팅 / 일반”세마포어가 있음을 지적해야합니다. 자바의 세마포어는 카운팅 세마포어이므로 1보다 큰 값으로 초기화 될 수 있습니다 (하지만 뮤텍스는 개념적으로 1 개만 카운트 할 수 있음). 이것의 유용성은 다른 게시물에서 지적되었습니다.

요약하자면 관리 할 리소스가 여러 개가 아니라면 항상 세마포어보다 뮤텍스를 권장합니다.


답변

뮤텍스는 기본적으로 상호 배제입니다. 한 번에 하나의 스레드 만 리소스를 얻을 수 있습니다. 한 스레드가 리소스를 획득하면 리소스를 소유 한 스레드가 해제 될 때까지 다른 스레드가 리소스를 획득 할 수 없습니다. 리소스 획득을 기다리는 모든 스레드가 차단됩니다.

세마포어는 실행중인 스레드 수를 제어하는 ​​데 사용됩니다. 고정 된 리소스 세트가 있습니다. 스레드가 동일한 것을 소유 할 때마다 리소스 수가 감소합니다. 세마포어 수가 0에 도달하면 다른 스레드가 리소스를 획득 할 수 없습니다. 스레드는 리소스를 소유 한 다른 스레드가 해제 될 때까지 차단됩니다.

요컨대, 주요 차이점은 한 번에 리소스를 획득 할 수있는 스레드 수입니다.

  • 뮤텍스는 하나입니다.
  • 세마포어-DEFINED_COUNT (세마포어 수만큼)

답변

뮤텍스는 리소스에 대한 직렬 액세스에 사용되는 반면 세마포어는 설정된 번호까지 리소스에 대한 액세스를 제한합니다. 뮤텍스는 액세스 수가 1 인 세마포로 생각할 수 있습니다. 세마포어 수를 설정 한 값이 무엇이든간에 스레드는 리소스가 차단되기 전에 리소스에 액세스 할 수 있습니다.


답변

세마포어는 계산 동기화 메커니즘이지만 뮤텍스는 그렇지 않습니다.


답변

뮤텍스는 종종 이진 세마포어로 알려져 있습니다. 0이 아닌 카운트로 세마포어를 만들 수 있지만 뮤텍스는 개념적으로 상위 카운트가 1 인 세마포어입니다.


답변

이 질문에는 관련 답변과 공식 Java 지침에 대한 링크 가 있습니다. Java에 Mutex가 있습니까?