锁定问题

时间:2011-04-01 11:25:13

标签: java multithreading locking

我有一个类型为Collections.synchronizedMap的地图。该映射包含数据库表。

现在我有3个方法和2个锁。第一个锁定地图中的每个数据库表。第二个锁定地图。我知道它的aSynchronised地图所以我不需要锁,但是由于其他原因我需要它。

       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
 }

我遇到一个阻塞的情况,当在method1上一个readlock发生在表上,然后在method2中获取写入地图后...

我在某处做错了吗?

1 个答案:

答案 0 :(得分:0)

在方法1中,您将获得表上的readlock。在method2中,您尝试在其读取锁定尚未释放时获取表上的writelock。因此程序挂起,等待表上的所有其他锁被释放。然后发生僵局。