2011-04-01 7 views
0

Collections.synchronizedMap 유형의지도가 있습니다. 지도에는 데이터베이스 테이블이 있습니다.잠금 문제가 있습니다.

이제 3 가지 방법과 2 가지 잠금 기능이 있습니다. 지도의 각 데이터베이스 테이블 주변의 첫 번째 잠금 및지도 둘째 잠금. 나는 그것의 aSynchronized지도를 안다. 그래서 나는 자물쇠가 필요 없다. 그러나 나는 다른 어떤 이유 때문에 그것을 필요로한다. 방법 항목에서 readlock 테이블에 일어날 때하고 ...지도에서 쓰기를 얻기 후에 방법 2에

가 어디 선가 뭔가 잘못하고 있는가하면
 method1() 
     { 
      calls readlock on a table (first lock) 
      try{ 
       if(certain condition is satisfied) 
       { 
       call method2 
       } 
      }finally{ 
       realease readlock on the table (first lock) 
      } 
     } 
method2(){ 
     call write lock on the map first (second lock) 
     call write on the table now(first lock) 
     try{ 
      //do stuff 
     }finally{ 
     unlock write lock on table. 
      unlock writelock on map. 
     } 
} 

Method3(Lock){ //This lock is lock on tables ,can be read as well as write,but unlocked now 
grab readlock on map first 
try{ 
     //do stuff 
     Lock.lock() //lock the table lock now 
    }finally{ 
     realease the readlock now on map 
} 

나는 차단 된 상황을 무엇입니까?

+0

질문 (제목 포함)을 수정하여 비웃음 부분을 제거하십시오. 읽는 것이 더 어렵습니다. 코드를 제대로 포맷해도 도움이 될 것입니다. – Mat

+0

R/W 잠금 장치는 재입 가능 잠금 장치입니다. 업그레이드 할 수 없습니다. –

+0

적절한 코드 형식을 지정하면 코드를 쉽게 따라갈 수 있습니다. – jmg

답변

0

방법 1에서 테이블에 대한 읽기 잠금을 얻습니다. method2에서 읽기 잠금이 해제되지 않은 상태에서 테이블에서 writelock을 가져 오려고합니다. 따라서 프로그램은 테이블에있는 다른 모든 잠금이 해제 될 때까지 대기합니다. 그런 다음 교착 상태가 발생합니다.

+0

나는 지금 method2 jus를 호출하기 전에 readlock 잠금을 해제 ... 지금 jus 디버깅 그것을보고 ... . –