2012-10-09 2 views
3

나는 내 자신의 필요에 맞게 사용자 정의 클래스에 래핑하는 재진입 잠금을 가지고 있습니다. 그러나 응용 프로그램의 특성상 재진입 잠금에 대한 잠금을 보유한 스레드가 멈추고 (외부 실패) 재진입 잠금을 해제하지 못합니다.재진입 잠금을 강제로 잠금 해제

재진입 잠금을 명시 적으로 해제하는 방법이 있는지 궁금합니다. 재진입 성 잠금에 대한 API는 그런 방법이 없다는 것을 알고 있습니다. 그러나 일정 시간 후에 재진입 잠금을 해제하거나 재진입 잠금을 포함하는 스레드를 죽일 타이머 태스크를 도입하려고합니다.

내 입체 잠금을 강제로 해제하려는 다른 제안 사항이 있습니까? 내 솔루션은 꽤 있으므로 나는 묻습니다.

+0

몇 가지 샘플 코드가 있습니까 ?? 모든 잠금은'try/catch/finally' 블록에 래핑되어야합니다. 마지막 섹션에서 현재 잠금을 해제해야합니다. – MadProgrammer

답변

2

대신 외부 잠금 해제, 나는이 별도의 스레드에서 차단 코드를 실행하고 내 의견으로 당이

Future<MyTask>future = taskExecutor.submit(myTask) 
try { 
    future.get(5,TimeUnit.Seconds); 
    ... 
    } 
    catch (Exception e) 
    { 
     future.cancel(true); // attempt to interupt the thread 
     throw new Exception(); 
    } 
+0

쿨하고 좋은 물건, 확실히 그럴듯한 해결책. – rmoh21

+0

+1 - 잠금 해커보다 낫다. –

+0

나는 결국이 해결책으로 갔다 : – rmoh21

0

같은

뭔가를 시간 제한 것, 어떤 잠금 장치는 try/finally 감싸한다 뭔가

_lock.lock(); // will wait until this thread gets the lock 
try 
{ 
    // critical section 
} 
finally 
{ 
    //releasing the lock so that other threads can get notifies 
    _lock.unlock(); 
}  

Lock Objects에서 증명되고 잘못되면 잠금이 해제되도록 차단 트레일

+0

나는 응답을, 그러나, 나는 당신의보기에 의하여 "_lock"를 자물쇠로 열을 찾고있다. 홀더가 보유한 잠금 장치를 잠금 해제해야한다는 데 동의하지만 홀더 스레드는 외부 종속성으로 인해 때때로 펑키 상태가되어 잠금을 포기하지 않습니다. 내가 어떻게 든 스레드를 죽이지 않거나 강제로 "_lock"잠금을 해제하면 다른 스레드가 앞으로 진행하여 강제로 잠금 해제 메커니즘을 고려하고있는 것입니다. – rmoh21

+0

나는 당신이 원하는 것을 얻을 수 있다고 생각하지 않는다. 이것은 실제로 자물쇠의 목적을 물리 칠 것입니다. – MadProgrammer

+0

어떤 점에서는 전적으로 당신과 동의합니다 -하지만 본질적으로 내가 찾고있는 것은 지능적인 방법으로 응용 프로그램이 외부 오류로 인해 더 이상 진행하지 못하고 실패 할 수있는 지능적인 방법입니다. 자물쇠를 포기해라. Btw, _lock.unlock() 또한 unlock() 호출을 try/catch로 래핑해야한다면 IllegalMontiorStateException을 발생시킵니다. 잠금 해제()에 대해 closeQuietly()가 있습니까? – rmoh21

관련 문제