2013-08-22 1 views
0

ReentrantLock에서 "lock()"을 호출하고 스레드가 분명히해서는 안되는 경우에 스레드가 멈추는 경우가 있습니다.ReentrantLock은 "잠금 해제"라고하지만 첫 번째 스레드는 멈 춥니 다.

"lock()"호출 바로 전에 중단 점을 사용하여 디버깅 할 때 첫 번째 스레드는 프로그램 포인터가 "Thread.exit()"로 이동하면서 중단됩니다. 잠금 객체의 toString()은 "잠금 해제 됨"을 나타내며 "상태"속성은 "0"입니다. 동작이 항상 동일하지는 않습니다. 때로는 첫 번째 스레드가 예상대로 잠금을 지나칠 수 있습니다.

userLock.lock(); //first thread sometimes gets stuck here (and the following ones as well) 
        //"userLock" has "state=0" and toString() says "UNLOCKED" 

    try { 
     Transaction tr = HibernateConfig.getSessionFactory().getCurrentSession().beginTransaction(); 
     try { 
      execute(); 
      tr.commit(); 
     } catch (ConstraintViolationException e) { 
      //probably traces with repeated time 
      System.err.println(e.getMessage()); 
      if (tr.isActive()) { 
       tr.rollback(); 
      } 
     } catch (RuntimeException e) { 
      e.printStackTrace(); 
      if (tr.isActive()) { 
       tr.rollback(); 
      } 
     } 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } finally { 
     userLock.unlock(); 
    } 
+0

이럴 가능성은 희박합니다. 아마도 상태를 인쇄 한 직후에 잠금을 훔치는 다른 스레드가 활성화되어 있을까요? 잠금 장치가 잠길 수있는 가능한 모든 위치에서 디버그 메시지를 인쇄하거나 중단 점을 설정하십시오. – davmac

+0

다른 잠금 장치가 없습니다. 그 전에 브레이크 포인트를 두었으므로 잠글 수있는 모든 스레드를 가져와야합니다. 상태를 인쇄하지 않았지만 내 스레드가 중단 점에있는 동안 디버깅 GUI에서 가져 왔습니다. – Vituel

답변

1

userLock.lock(); 그러면 스레드를 가져와 잠금을 얻습니다. 또는 userLock.getOwner();를 사용할 수 있습니다. lock 바로 뒤에있는 .lock() 바로 뒤에있는 스레드가 자물쇠를 가지고 있는지 확인하십시오.

0

문제는 내 중단 점이 () 전에 "lock()"이 아니라고 말했지만, 입니다. 무슨 일이 있었는지는 그 줄에서 중단 점에 의해 차단 될 스레드들 중 하나 일 것입니다. 그 중 하나는 여전히 잠금을 획득 할 것이고 디버거는 잠금을 획득하지 않은 임의의 하나를 제어하게됩니다. 그리고 무료 지점을 찾기 위해 중단 점에 의해 차단 된 모든 스레드를 확인하지 못했습니다.

결국 나는 중단 점을 전에 넣고을 잠그고 예상대로 작동합니다. 이것은 혼란 스러웠으며 질문이 여전히 도움이되기를 바랍니다.

참고 : 잠긴 스레드를 제어하는 ​​동안 디버거에서 잠금 상태가 "잠금 해제되었습니다"라는 사실에 아직도 혼란 스럽습니다.

+0

이것은 여전히 ​​의미가 없습니다. 한 줄에 중단 점이있는 경우 중단 점은 줄이 실행되기 전에 실행됩니다. 나는 당신이 여기에있는 것이 미묘한 JVM/JPDA 버그인지 궁금합니다. – davmac