基于参数锁定

Bra*_*ley 9 .net c# concurrency

假设我有这个方法:

void Foo(int bar)
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这是我想要的行为Foo:

  1. 如果线程1调用Foo(1)线程2调用Foo(2),则两个线程可以并发运行.

  2. 如果线程1调用Foo(1)线程2调用Foo(1),则两个线程不能同时运行.

是否有一种良好,标准的方式.net来指定这种行为?我有一个使用对象字典锁定的解决方案,但这感觉有点混乱.

Kon*_*lph 8

使用为不同参数提供不同锁定对象的字典.在实例化基础对象时设置字典(或静态地,如果适用):

var locks = new Dictionary<int, object>() {
    {1, new Object()},
    {2, new Object()},
    …
};
Run Code Online (Sandbox Code Playgroud)

然后在你的方法中使用它:

void Foo(int bar) {
    lock (locks[bar]) {
        …
    }
}
Run Code Online (Sandbox Code Playgroud)

我不会说这个解决方案很混乱,恰恰相反:提供一个精确的锁定粒度是值得称道的,因为值类型的锁在.NET中不起作用,所以有一个映射是显而易见的解决方案.

但要小心:只要不同时修改和读取字典,上述内容才有效.因此,最好在设置后将字典视为只读.

  • 请注意,只有在读取字典时才会写入该字典,此代码才是正确的. (2认同)