我使用lock
将项目添加到list
并行foreach,如下所示。
Parallel.ForEach(list, i =>
{
//...
lock (LockThread)
{
_asset.Add(...);
}
});
LockThread是static readonly object
。
我的理解是lock
使得单线程阻塞,并且不允许在那里进行多任务处理。
那么我为什么要给它一个对象呢?它做了什么?
为什么我不能写
lock {...}
答案 0 :(得分:2)
对于给定的lock (refrenceMemoryObject) {
// Scope
}
,使用该对象的最多一个object
语句中的代码可以在时间执行。
如果你有
lock
然后
var obj1 = new object();
var obj2 = new object();
然后代码块1a和代码块2可以同时执行,代码块1b和2也可以执行。代码块1a和1b将不能同时执行。当然,一次只有一个线程可以执行代码块1a,同样也可以执行其他线程。
答案 1 :(得分:0)
它依赖于你想要在不同线程之间共享的对象,如果对象是ThreadSafe那么你不需要锁定但是对于非线程安全应该确保只有一个线程同时访问该对象时间
例如,您可以找到Collection和ConcurrentCollection
之间的差异答案 2 :(得分:0)
当您申请lock
时,您基本上会说,"从现在开始,只有1个人可以使用此范围"锁定发生在标记为block of memory
的{{1}}上,因此我们使用最基本的形式来保存blocked
类的内存。
object
您可以阅读有关锁定HERE
的更多信息