2014-04-14 32 views
0

我有一個Android模擬器的客戶端下面的代碼片段:混亂獲取和鎖釋放

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) { 
    String key = selection;  
    String keyHash = genHash(key); 
    Log.v("provider.query","Key & keyHash: "+key+" & "+keyHash); 
    if(SimpleDhtUtil.toForward(keyHash, currentHash, predecessorHash)){ 
     DhtDto dto = new QueryTransfer(successorPort, currentPort, -1, key, keyHash); 
     st.makeSendRequest(dto); 
     synchronized(BigLock.LOCK){ 
      SimpleDhtUtil.cursorReset(); 
      requiredAnswers = 1; 
      currentAnswers = 0; 
     } 
     while(requiredAnswers>currentAnswers){ 
      synchronized(BigLock.LOCK){ 

       try{ 
        if(requiredAnswers>currentAnswers){ 
         Log.d("provider.externalQueryLock","CA: "+currentAnswers+"RA: "+requiredAnswers+" Waiting... "+BigLock.LOCK); 
         BigLock.LOCK.wait(); 
         Log.d("provider.externalQueryLock","Woke up"); 
        } 
      }catch(InterruptedException e){ 
       Log.e("provider.query", "InterruptedException",e); 
      } 
     } 
    } 
    return SimpleDhtUtil.getCursor(); 
} 

相同AVD的服務器在下面的代碼:

private void acceptAnswer(QueryAcknowledge qa) {     
// Object lock = SimpleDhtProvider.externalQueryLock; 
    synchronized(BigLock.LOCK){ 
     SimpleDhtProvider.currentAnswers += 1; 
     Log.d("ReceiverTask.acceptAnswer","Got result. Current count: "+SimpleDhtProvider.currentAnswers); 
     SimpleDhtUtil.addValues(qa.getRecords()); 
     Log.d("ReceiverTask.acceptAnswer","Aggregated result. Net count: "+SimpleDhtUtil.getCursor().getCount());  
     BigLock.LOCK.notifyAll(); 
     Log.d("ReceiverTask.acceptAnswer","lock released: "+BigLock.LOCK); 
    }  
} 

現在問題是,當釋放服務器代碼中的鎖時,我希望通知客戶端鎖並喚醒。這發生在80%以上的時間。但有時它會卡住。找到下面的android日誌。此外,currentAnswers和requiredAnswers總是從客戶端處理,即這些變量在客戶端中是靜態和易失的,而BigLock是隻有一個值爲LOCK的枚舉。

客戶端日誌:

04-14 08:14:07.172: V/provider.query(2699): Key & keyHash: 6oLNUimWIuAM4YWN183cwtz0te5aq6r7 & 837cccd1cac03a9c4c9169fad595a997d2673920 
04-14 08:14:07.202: D/provider.externalQueryLock(2699): CA: 0RA: 1 Waiting... LOCK 

服務器日誌:

04-14 08:14:07.192: D/ReceiverTask.acceptAnswer(2699): Got result. Current count: 2 
04-14 08:14:07.192: D/ReceiverTask.acceptAnswer(2699): Aggregated result. Net count: 2 
04-14 08:14:07.192: D/ReceiverTask.acceptAnswer(2699): lock released: LOCK 

回答

0

這裏的問題是,我會發送來自客戶端的請求,假設服務器將復位後收到回覆後重置光標光標在下一行。

正確的順序首先重置光標,然後發送請求。