InterProcessMutex
와 InterProcessSemaphoreMutex
의 차이점은 무엇입니까? docs은 InterProcessSemaphoreMutex
이 이 아닌 것을 제외하고는 재진입입니다. 그러나 나는 모른다 무엇 재진입 의미합니다.큐레이터 InterProcessMutex 대 InterProcessSemaphoreMutex
답변
이 문맥에서 재진입이란 스레드가 동일한 잠금에서 두 번 이상 acquire를 호출 할 수 있고 두 번째 또는 세 번째 호출 할 때 차단하지 않을 수 있음을 의미합니다. 그러나 동일한 수의 릴리스로 모든 획득을 균형을 유지해야합니다. 더 재입 잠금에 대한이 StackOverflow의 게시물 회담 :
Shared Re-entrant lock aka InterProcessMutex :
이
public void acquire()
큐레이터에What is the Re-entrant lock and concept in general?
특정, 여기에 문서는 다른 잠금 장치에 대해 말해야하는 것입니다
뮤텍스 획득 - 까지 차단. 주 : 동일한 스레드가 재진입 호출을 호출 할 수 있습니다. 취득하는 각 호출 해제 호출에 의해 균형을 이루어야한다()
Shared lock (non-reentrant) aka InterProcessSemaphoreMutex :
public void acquire()
가 뮤텍스 획득 -가 사용할 때까지 차단합니다. release() 호출로 균형을 맞추어야합니다.
lock
이 재진입 잠금 인 경우 아래 코드는 실행 완료 후 정상적으로 작동합니다.
lock.acquire();
lock.acquire();
doWork();
lock.release();
lock.release();
재진입 잠금 구현에 조금 더 비용이 많이 드는 경향이 있지만, 사용하기 쉬운 : lock
가 재진입 잠금되지 않은 경우, 스레드가 두 번째 lock.acquire()
를 호출하는 동안 교착 상태 것이다.
위의 패턴은 잠금해야하는 API에 여러 공용 메소드가있을 때 자주 발생하지만 구현시 다른 공용 메소드를 호출하는 public 메소드가 있습니다. 공용 메소드가 잠금을 수행하고 잠금 만 수행하고 잠금이 항상 잠금 아래에서 실행된다고 가정하는 개인 메소드를 호출하면이 문제를 피할 수 있습니다. 비공개의 메소드는, 복수의 락을 취득 할 필요없이, 다른 private 메소드를 호출 할 수가 있습니다.
편집 Randgalt의 의견 @ 해결하기 :
큐레이터의 InterProcessMutex가 요구하는 잠금 해제를 획득 동일한 스레드. InterProcessSemaphoreMutex는 그렇지 않습니다. 내가 쓴 것을 잘못 읽은 것일까 요? 어쩌면 나는 명확하지 않았을까요? 모르겠다. 어쨌든,이 경우입니다.
이것은 명백하게 거짓입니다. 락을 취득한 thread 이외의 thread로부터 락을 해제 할 수 없습니다.게다가 이것은 여전히이 문맥에서 "재진입이란 무엇입니까?"라는 질문과 아무런 관련이 없습니다.이 맥락에서 재진입이란 동일한 스레드에서 동일한 잠금에 대해 두 번 이상 획득을 호출 할 수 있는지 여부입니다 .
: 호출 스레드가를 인수 동일한 스레드 경우
public void release()
뮤텍스 중 하나 개 방출을 수행합니다. thread가 acquire에 복수의 호출을 한 경우,이 메소드가 복귀해도 뮤텍스는 보관 유지됩니다.
InterProcessSemaphoreMutex.release()
: 호출 스레드가 인수 동일한 스레드 경우
public void release()
뮤텍스 중 하나 개 방출을 수행합니다.
강조가 추가되었습니다. 두 자물쇠는 모두 자물쇠를 소유 한 스레드가 아닌 다른 스레드에서 자물쇠를 해제 할 수 있습니다. 두 가지 자물쇠가 모두 뮤텍스이며 뮤텍스의 속성 중 하나이기 때문에 의미가 있습니다.
저는 Apache Curator의 주 저자입니다. 문서의 내용과 관계없이 필자는 기록을 위해 두 클래스 각각에 대한 정확한 사용 사례를 제공하고 싶습니다. 당신이 재진입 방식으로 고정 할 수 있어야 할 때
InterProcessMutex은
InterProcessMutex
사용되어야한다. 이것은 주어진 스레드가 일단 획득 된 잠금을 "소유"한다고 말하며 필요할 경우 다시 잠글 수 있습니다. 이것은 스레드가 잠금 객체를 전달할 때 잠금을 획득했는지 여부를 고려할 필요가없는 다른 메소드로 전달할 때 유용합니다. 이것은 소유하는 스레드 만 잠금을 해제 할 수 있음을 의미합니다. 다음 예는 다음과 같습니다 잠금이 IllegalMonitorStateException
가 발생 잠금을 획득하는 데 사용되는 것과 다른 스레드에서 해제 될 경우
InterProcessMutex lock = new InterProcessMutex(...);
if (!lock.acquire(...)) ... // if acquire failed: throw, return, etc
try {
doWork(lock); // doWork() can safely call lock.acquire() again on the lock
} finally {
lock.release();
}
일단, 인수했다.
InterProcessSemaphoreMutex
InterProcessSemaphoreMutex
그것을 획득 한 스레드의 메모를하지 않습니다 잠금의 편안한 버전입니다. 그것은보다 단순한 의미를 갖는다. 각 InterProcessSemaphoreMutex 인스턴스는 정확히 한 번 획득 할 수 있으며 릴리스 (모든 스레드에서)와 균형을 맞추어야합니다. 즉
InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(...);
lock.acquire();
lock.acquire(); // this will block forever
이 정보가 도움이되기를 바랍니다. 문서에 설명이 필요하면 개선 된 끌어 오기 요청을 보내 주시면 감사하겠습니다.
대단한 답변을 보내 주셔서 감사합니다. 재진입이 아닌 잠금은 교착 상태가 발생하기 쉽습니다. 재진입 가능 잠금이 아닌 재진입을 사용하는 것이 더 나은 유스 케이스가 있습니까? – Glide
@ 글라이드 - 성능이 좋을 것 같습니다. – antiduh
여러 번 잠금을 해제 한 스레드에서 잠금을 해제 할 수 없거나 상관하지 않습니다. 이 경우 재진입 가능하지 않은 잠금이 선택입니다. – Randgalt