给Lock的对象是什么

时间:2015-06-15 23:19:29

标签: c# locking

我使用lock将项目添加到list并行foreach,如下所示。

        Parallel.ForEach(list, i =>
            {
                //...

                lock (LockThread)
                {
                    _asset.Add(...);
                }
            });

LockThread是static readonly object

我的理解是lock使得单线程阻塞,并且不允许在那里进行多任务处理。

那么我为什么要给它一个对象呢?它做了什么?

为什么我不能写

lock {...}

3 个答案:

答案 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那么你不需要锁定但是对于非线程安全应该确保只有一个线程同时访问该对象时间

例如,您可以找到CollectionConcurrentCollection

之间的差异

答案 2 :(得分:0)

当您申请lock时,您基本上会说,"从现在开始,只有1个人可以使用此范围"锁定发生在标记为block of memory的{​​{1}}上,因此我们使用最基本的形式来保存blocked类的内存。

object

您可以阅读有关锁定HERE

的更多信息