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

标签 c# list locking

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

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();
        ...
    }
}

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

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

所以,第一类有第二类使用的公共(public)列表。第一类在一个线程中定期更新列表,第二类在第二个线程中以随机间隔读取列表。

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

最佳答案

不,不是。

唯一能确保的是列表在您从属性返回时不会被修改。
由于字段访问已保证是原子的,因此它是一个完全无用的锁。

您需要对整个 foreach 加锁环形。


请注意,使用 ReaderWriterLockSlim 可以获得更好的性能,使用 ConcurrentBag<T> 可以获得更好的性能。没有任何锁。

关于c# - 如何在 C# 中正确锁定 List<String> getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5929933/

相关文章:

c# - 无法在 selenium webdriver 中找到::之前的 css 选择器元素

c# - 通过 C# 检索 CRM 中所有帐户的列表?

Python——获取排序列表中元素索引的有效方法,按多个属性排序

python - 每隔 n 个位置将列表中的项目插入另一个列表

Java并发尝试加锁

c# - 如何在 C# 窗口应用程序中以编程方式创建按钮?

python - list of list 的处理

c++ - 如何正确序列化线程访问控制循环的标志

android - 即使音量处于最大状态,服务也会降低音量

c# - 使用 C# Azure Function 中的 ShareFileClient 逐行将文件写入 Azure Blob File Share