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