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

Jon*_*Jon 9 .net c# multithreading c#-4.0

如果我有这样的事情:

private readonly object objectLock = new object();

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

public void MethodB()
{
    lock(objectLock)
    {
      //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*lad 5

是的,你的解释是正确的 - 除非已经采取了锁定(在这种情况下,两个线程都在等待,并且任意一个线程在锁定后立即获得锁定).

(稍微偏离主题)如果他们做的事情非常重要,我建议不要锁定整个方法.尽量保持代码的"锁定"部分尽可能小和尽可能快.


Ern*_*rno 5

那是正确的.

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

将传递给lock关键字的对象视为解锁多个门的密钥,但一次只能授予对单个房间的访问权限.