C#中的锁定范围:返回的对象是否仍然"锁定"?

Pie*_*ine 5 c# multithreading thread-safety

假设我有一个包含的对象A.

// ...

private List<double> someList = new List<double>();

// ... 

public List<double> SomeList
{
    get { lock (this) { return someList; } }
}

// ...
Run Code Online (Sandbox Code Playgroud)

在下面的代码中对列表执行操作是否是线程安全的.知道几个操作可以由不同的线程同时执行.

A.SomeList.Add(2.0);
Run Code Online (Sandbox Code Playgroud)

要么

A.SomeList.RemoveAt(0);
Run Code Online (Sandbox Code Playgroud)

换句话说,什么时候锁被释放?

Ode*_*ded 12

这里没有线程安全.

lock是只要它保护完成后,就在属性返回之前的程序释放出来,所以要调用Add的广告RemoveAt不被锁保护.


Geb*_*ebb 5

您在问题中显示的锁定没有多大用处.

要使列表操作线程安全,您需要实现自己的Add/Remove/etc方法,包装列表中的那些.

public void Add(double item)
{
    lock(_list)
    {
        _list.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,最好将列表本身隐藏在类的消费者中,即将字段设为私有.

  • 你不能像这样访问`List <T>`上的`SyncRoot`,因为它是一个显式的接口实现.我认为没有充分的理由使用它,它主要是为了向后兼容. (2认同)