【发布时间】:2016-07-04 19:16:45
【问题描述】:
我使用静态 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。
【问题讨论】:
-
缓存的目标是什么?您真的希望每个线程都有自己的大对象副本吗?或者您是否真的希望以线程安全的方式与所有线程共享一个 single 大对象?如果是后者,请查看 Lazy 类。
-
@sstan 你问对了问题。我真的不想拥有 250 个大对象实例。理想的情况是实例数量与在特定时间实际上在 tempImages 上执行某些操作的并发线程数一样少,例如对应于 8 个超线程内核的 8 个实例。 Lazy 没有完成这项工作,因为它与初始化无关。大对象是由 DoSomething() 操作的临时图像,因此单个实例在这里不起作用。
标签: c# multithreading