如何在需要锁定多个对象时防止死锁

Pet*_*etr 4 c#

想象这段代码:

你有2个阵列,你需要在同一时刻锁定它们(出于任何原因 - 你只需要保持锁定它们,因为它们以某种方式相互依赖) - 你可以嵌套锁

lock (array1)
{
    lock (array2)
    {
        ... do your code
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果代码的其他部分中有人会这样做,这可能会导致死锁

lock (array2)
{
    lock (array1)
    {
        ... do your code
    }
}
Run Code Online (Sandbox Code Playgroud)

并且数组1被锁定 - 执行上下文切换 - 然后数组2被第二个线程锁定.

有没有办法以原子方式锁定它们?如

lock_array(array1, array2)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建一些额外的"锁定对象"并在我的代码中锁定而不是两个数组,但这对我来说似乎不正确...

Dar*_*rov 5

通常,您应该避免锁定可公开访问的成员(在您的情况下为数组).你宁愿让private static object你锁定.

  • 除非数组也是静态的,否则不要将锁定对象设为静态 - 否则您将毫无意义地阻止同时访问完全独立的数组。无意义的锁定是不好的。如果数组不是静态的,则将锁定对象设为非静态字段。(当然,我假设这两个数组都在同一个类中。) (2认同)