2017-10-09 1 views

답변

0

이 문맥에서 재진입이란 스레드가 동일한 잠금에서 두 번 이상 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로부터 락을 해제 할 수 없습니다.게다가 이것은 여전히이 문맥에서 "재진입이란 무엇입니까?"라는 질문과 아무런 관련이 없습니다.이 맥락에서 재진입이란 동일한 스레드에서 동일한 잠금에 대해 두 번 이상 획득을 호출 할 수 있는지 여부입니다 .

InterProcessMutex.release()

: 호출 스레드가를 인수 동일한 스레드 경우

public void release()
뮤텍스 중 하나 개 방출을 수행합니다. thread가 acquire에 복수의 호출을 한 경우,이 메소드가 복귀해도 뮤텍스는 보관 유지됩니다.

InterProcessSemaphoreMutex.release()

: 호출 스레드가 인수 동일한 스레드 경우

public void release()
뮤텍스 중 하나 개 방출을 수행합니다.

강조가 추가되었습니다. 두 자물쇠는 모두 자물쇠를 소유 한 스레드가 아닌 다른 스레드에서 자물쇠를 해제 할 수 있습니다. 두 가지 자물쇠가 모두 뮤텍스이며 뮤텍스의 속성 중 하나이기 때문에 의미가 있습니다.

+0

대단한 답변을 보내 주셔서 감사합니다. 재진입이 아닌 잠금은 교착 상태가 발생하기 쉽습니다. 재진입 가능 잠금이 아닌 재진입을 사용하는 것이 더 나은 유스 케이스가 있습니까? – Glide

+0

@ 글라이드 - 성능이 좋을 것 같습니다. – antiduh

+0

여러 번 잠금을 해제 한 스레드에서 잠금을 해제 할 수 없거나 상관하지 않습니다. 이 경우 재진입 가능하지 않은 잠금이 선택입니다. – Randgalt

1

저는 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 

이 정보가 도움이되기를 바랍니다. 문서에 설명이 필요하면 개선 된 끌어 오기 요청을 보내 주시면 감사하겠습니다.

+0

"re-entrancy"에 대한 귀하의 정의는 지역 사회가 인정한 정의와 동일하지 않습니다. https://stackoverflow.com/questions/1312259/ 참조 : "재진입 잠금은 프로세스가 잠금을 사용하지 않고 여러 번 잠금을 여러 번 요청할 수있는 잠금입니다." – antiduh

+0

@antiduh InterProcessMutex는 해당 정의를 충족합니다. 이것은 지루해지고있다. – Randgalt

관련 문제