工作中經常會遇到這樣的場景:一項複雜的工作耗費的時間比較長,為了避免重複這個過程,僅僅只需要乙個執行緒去做這個工作就好了,其他的執行緒等待這個執行緒的工作結果,有幾種方式可以實現這個模式,下面就總結了幾種方式然後分析他們之間的不同。
1通過future實現
基本**如下:
public class cachetest
result = dosomething();
cache.put(r, result);
return result;
}t dosomething()
}
需要注意的是需要重寫request 的hashcode和equals方法
採取了同步方法來避免多執行緒同時請求,但是問題對於整個方法的同步這個粒度較大,是靈活性不夠,其他的執行緒必須等待,下面有一種不用同步方法的實現方式。
class cachetest2
};futuretaskft = new futuretask(v);
f = cache.putifabsent(r, ft);
if(f == null)
}return f.get();
}t dosomething(request r)
}
第一條執行緒首先在快取中查詢是否有相應的物件(futuredata),如果不存在的話那這個執行緒就是第一條執行緒,是要去生產realdata的,他會繼續往下執行生產過程,
2物件鎖
基本原理是每條執行緒來的時候檢測快取彙總有沒有處理好的結果,或者是處理中的結果(使用臨時物件,如果是臨時物件,則執行緒會等待處理結果),第一條執行緒來將臨時物件放進快取,然後自己去生成真實的返回物件,整個工作完成後把真實物件放進快取,然後喚醒其他的執行緒。
class cachetest2 else if (value == pendinggenerationmarker) catch (interruptedexception e)
continue;
} else
} while (true);
}try catch (exception e) finally
}return value;
}object dosomething(request r)
}
這種方式比較靈活之處是在等待時間的處理方面,當等待時間超時後,邏輯處理可以返回null值,這樣等待執行緒可以繼續處理自己的其他邏輯,之後再回來檢視是否複雜物件已經生產完畢。
對於快取的結果資料如果較大,佔據記憶體空間很多時,又不想太麻煩寫乙個快取定時刪除機制,可以使用weakreference和softreference來實現。weakhashmap可以幫助實現這個功能。只需要將物件放入這個map,取出的時候首先取出reference 例項,然後取出真實的值:(reference) value).get()
在put的時候需要將值封裝為weakreference 的形式:
cache.put(key, new weakreference(value));
多執行緒之間同步
1 posix訊號量 includeint sem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem wait sem t sem sem trywait sem t sem int sem...
多執行緒之間通訊
多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類 class res輸入執行緒資源 class intthrad extends thread overr...
多執行緒之間通訊
多執行緒之間通訊 就是多個執行緒在操作同乙個資源,但是操作的動作不同 現在需要實現,生產一台電機,銷售一台電機問題。實現 執行結果 資料發生錯亂,造成執行緒安全問題 解決執行緒安全問題 通過wait notify來解決。wait和sleep的區別 wait可以指定時間也可以不指定時間,sleep必須...