我使用一個靜態的ThreadLocal來緩存一些重量級的對象。考慮下面的代碼:ThreadLocal和任務
class MatchItemFinder
{
private static ThreadLocal<PaddedImage> tempImage;
MatchItemFinder()
{
if(tempImage==null)
tempImage = new ThreadLocal<PaddedImage>(
() => new PaddedImage(patchSize, patchSize));
}
internal void DoSomething(){
//Do something with tempImage.Value
}
}
當從多個任務並行庫線程中調用DoSomething()時,每個實例創建時?我的意思是顯然線程被重用,所以我的tempImage每創建一個線程或每次線程被重用時創建?
從設計的角度來看,你認爲這種緩存是一個很好的決定,還是有更好的策略來以線程安全的方式緩存大對象?
我使用.NET 4
http://stackoverflow.com/questions/854976/will-values-in-my-threadstatic-variables-still-be-there-when-cycled-via-threadpo –
緩存的目標是什麼?你真的想讓每個線程擁有自己的大對象副本嗎?或者你真的在尋找與所有線程共享一個*單個*大對象,但是以線程安全的方式?如果是後者,請查看[Lazy](https://msdn.microsoft.com/en-us/library/dd642331(v = vs.110).aspx)類。 – sstan
@sstan您正在問正確的問題。我真的不想擁有250個大對象的實例。最理想的情況是具有與特定時間的併發線程數量一樣少的實例,例如對應於8個超線程核心的8個實例。懶惰不做這項工作,因爲它不是初始化。大對象是由DoSomething()操作的臨時圖像,因此單個實例在這裏不起作用。 –