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
이 정보가 도움이되기를 바랍니다. 문서에 설명이 필요하면 개선 된 끌어 오기 요청을 보내 주시면 감사하겠습니다.
- 1. 큐레이터 : InterProcessMutex Lock.release()가 잠금 경로를 삭제하지 않았습니다.
- 2. Netflix 큐레이터 : 커밋 트랜잭션
- 3. MVN없는 큐레이터 프레임 워크
- 4. 창문에있는 Elasticsearch 큐레이터?
- 5. 큐레이터 TreeCache 최종 일관성
- 6. 시간 초과 구성은 큐레이터
- 7. 큐레이터 트랜잭션 KeeperErrorCode = NoNode
- 8. ConnectionStateListener에서 큐레이터 SUSPEND 상태를 처리하는 가장 좋은 방법
- 9. 큐레이터를위한 큐레이터 프레임 워크 객체
- 10. 사육사 서비스 검색기 연결 큐레이터
- 11. 큐레이터 배경 작업을 재 시도
- 12. 셸과 크론 간의 큐레이터 버전 불일치
- 13. 큐레이터의 유창한 API와 아파치 큐레이터 비동기
- 14. Apache Zookeeper/큐레이터 생존 시간 잠금
- 15. apache 큐레이터 및 기타 등등의 자세한 비교
- 16. 큐레이터 뮤텍스 잠금이 재 연결 후 실패했습니다
- 17. 사육사 큐레이터 캐시 동기화 대기 방법?
- 18. ZooKeeper 클러스터마다 큐레이터 프레임 워크 인스턴스를 두 개 이상 사용하면 어떤 결과를 얻을 수 있습니까? 아파치 큐레이터 웹 사이트에서
- 19. zookeeper 큐레이터 - PathCacheListener를 사용하여 자식 노드 만들기 이벤트 알림을받지 못합니다.
- 20. 큐레이터 프레임 워크 2.9.1에서 org.apache.zookeeper를 해결할 수 없습니다.
- 21. 큐레이터 프레임 워크를 사용하여 사육사 노드의 통계를 얻는 방법
- 22. 큐레이터 treeCache를 사용할 때 어떻게 캐시를 준비 할 수 있습니까?
- 23. 대 대 ë 대
- 24. 대 pymssql 대 pyodbc 대 adodbapi 대
- 25. 대 ID 대 UniqueID 대 ClientID 대 UniqueClientID 대 StaticClientID?
- 26. iPhone 대 XML 대 비누 대 JSON 대 RESTful
- 27. RailwayJS 대 Geddy 대 Express 대 Socket.IO
- 28. 부 대 대 C# 대 파이썬?
- 29. SDI 대 MDI 대 TDI 대?
- 30. 문자 대 wchar_t 대 char16_t 대 char32_t
대단한 답변을 보내 주셔서 감사합니다. 재진입이 아닌 잠금은 교착 상태가 발생하기 쉽습니다. 재진입 가능 잠금이 아닌 재진입을 사용하는 것이 더 나은 유스 케이스가 있습니까? – Glide
@ 글라이드 - 성능이 좋을 것 같습니다. – antiduh
여러 번 잠금을 해제 한 스레드에서 잠금을 해제 할 수 없거나 상관하지 않습니다. 이 경우 재진입 가능하지 않은 잠금이 선택입니다. – Randgalt