C# 同一对象锁定的多个代码块

C# 同一对象锁定的多个代码块,c#,.net,multithreading,c#-4.0,C#,.net,Multithreading,C# 4.0,如果我有这样的东西: private readonly object objectLock = new object(); public void MethodA() { lock(objectLock) { //do something } } public void MethodB() { lock(objectLock) { //do something } } 如果我有两个线程,两个线程同时进入,第一个线程调用

如果我有这样的东西:

private readonly object objectLock = new object();

public void MethodA()
{
    lock(objectLock)
    {
      //do something
    }
}

public void MethodB()
{
    lock(objectLock)
    {
      //do something
    }
}

如果我有两个线程,两个线程同时进入,第一个线程调用MethodA和第二个方法B。无论哪个线程先到达并锁定objectLock,我假设另一个线程在那里等待objectLock不再被锁定。

是的,您的解释是正确的——除非已经锁定(在这种情况下,两个线程都在等待,任意一个线程在解锁后立即获得锁)

(有点离题)我建议如果整个方法都在做一些非琐碎的事情,就不要锁定它们。尽量使代码的“锁定”部分尽可能小,速度尽可能快。

这是正确的

但是,锁定的不是objectLock(也不是对象),而是代码块


将传递给
lock
关键字的对象视为一把钥匙,它可以打开多扇门,但一次只能访问一个房间。

你完全正确!但是要小心锁。锁可能会使你的程序线程安全(意味着,在并发访问时没有错误)但是要使您的程序在多内核系统上真正发挥优势需要付出更多的努力。

是的,您作为监视器是正确的。Enter和Monitor.Exit在后台对同一个对象objectLock调用。请记住,同步的是代码块,而不是objectLock。

您是正确的。如果这不可取,那么考虑一下:

lock(objectLock)
{
  //do something
}
相当于:

Monitor.Enter(objectLock);
try
{
  //do something
}
finally
{
  Monitor.Exit(objectLock);
}
您可以将其替换为:

if(Monitor.TryEnter(objectLock, 250))//Don't wait more than 250ms
{
  try
  {
    //do something
  }
  finally
  {
    Monitor.Exit(objectLock);
  }
}
else
{
  //fallback code
}
还值得一看
TryEnter()
的重载,以及其他同步对象,如
readerwriterlocksim