在锁中使用非静态局部变量有什么意义?

ima*_*mak 6 c# synchronization

有几次我遇到过这个代码,其中一个类中的局部变量(它不是一个静态变量)已被用在一个锁中.

 public class SomeClass
{
    private object obj = new object();
    ....
    ....
    lock(obj)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

给出它的实例变量是否有任何锁定点?

jas*_*son 14

给出它的实例变量是否有任何锁定点?

多个线程可以作用于同一个实例,并且线程安全需要锁定.例如,考虑共享队列.

  • @imak:扩展Jason的例子:假设你有两个队列.Q1用于线程Alpha和Bravo.Q2用于Charlie和Delta线程.为什么线程Alpha访问Q1会阻止Charlie和Delta同时访问Q2?这应该可以阻止Bravo(以及Charlie和Delta)进入第一季度,但是在这段时间内,Charlie和Delta应该被禁止进入Q2. (2认同)

Jef*_*dge 5

静态锁对于控制对静态变量的访问很有用.实例锁对于控制对实例变量的访问很有用.

使用本地锁对象来保护局部变量没有任何意义(除非它是匿名函数或迭代器中捕获的外部变量),因为其他线程无法访问锁或变量.