为什么我应该在同步时将对象传递给lock关键字

时间:2015-10-24 13:25:22

标签: c# multithreading monitor

fgetpos

为什么我应该在同步上面的代码时将对象传递给lock关键字。如果我也传递它将在哪里使用。我知道它用于获取该对象的锁定。但我想知道我们如何获得锁定深度对象。线程如何释放我们在lock关键字中传递的对象的锁。

2 个答案:

答案 0 :(得分:4)

lock语句是使用Monitor方法进行线程同步的语法糖。 Monitor表示某些资源上的独占锁,而在.NET中,资源对象

为什么需要提供Monitor的对象引用?好吧,因为你想在多线程环境中同步对整个对象的访问。

  

线程如何释放我们传入锁定对象的锁定   关键字?

考虑lock如下:

Monitor.Enter(obj);

try
{
    // This would be the code inside the "lock" block
}
finally
{
    if(Monitor.IsEntered(obj))
       Monitor.Exit(obj); // <-- This is how a Monitor releases the lock
}

答案 1 :(得分:0)

您不需要将锁定限制为Object对象,例如,您可以锁定Dictionary对象,以防止其他线程从集合中添加或删除。

如果您不想使用lock关键字,可以使用[MethodImpl(MethodImplOptions.Synchronized)]

例如

 [MethodImpl(MethodImplOptions.Synchronized)]
 static void mySynchronisedTask()
 {
     //do things that i want to be synchronised
     Console.WriteLine("before sync task");
     Thread.Sleep(5000);
     Console.WriteLine("after sync task");
 }