如何在C#中正确锁定List <String> getter

c0l*_*row 7 c# locking list

我想知道如何正确锁定类型的吸气剂List<String>.我有一个看起来像这样的静态类:

class FirstClass {
static private locker = new object();   
static private List<String> _my_list;

public static List<String> my_list {
    get {
        lock(locker) {
            return my_list;
        }
    }
}

private static void thread_func() {
    // do something periodicaly with the list
    // for example:

    lock(locker){
        _my_list.Add();
        _my_list.RemoveAt();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

}

然后,我有另一个类看起来像这样:

class SecondClass {
private void thread_func() {
    foreach(string s in FirstClass.my_list) {
        // read every item in the list
    }
}
Run Code Online (Sandbox Code Playgroud)

}

因此,第一类有一个第二类使用的公共列表.第一类定期更新一个线程中的列表,第二个类在第二个线程上以随机间隔读取列表.

这个锁定机制是否确保第一个类在第二个类读取时不会修改列表,反之亦然?

SLa*_*aks 7

不,它没有.

所有这一切都确保了在您从属性中返回列表时不会修改列表.
由于现场访问已经保证是原子的,因此它是一个完全没用的锁.

你需要锁定整个foreach循环.


请注意,使用ReaderWriterLockSlim可以获得更好的性能,使用ConcurrentBag<T>不带任何锁定可以获得更好的性能.

  • 一些警告:*(1)*`ReaderWriterLockSlim`不是灵丹妙药.根据访问模式等,它通常比普通的"锁定"具有更差的性能.*(2)*`List <T>`有一个显式排序,`ConcurrentBag <T>`没有. (2认同)