在多线程应用程序中交换变量引用时,C#是否需要锁定

Mas*_*Mas 13 .net c# multithreading

我有一个应用程序,我想要多个线程来读取列表.我想定期用新数据更新列表.当列表更新时,我想我可以创建一个新列表并将其替换为旧列表.例:

private List<string> _list = new List<string>();
private void UpdateList()
{
    var newList = new List<string>(QueryList(...));
    _list = newList;
}

private void ThreadRun()
{
    foreach (var item in _list)
    {
        // process item...
    }
}
Run Code Online (Sandbox Code Playgroud)

在UpdateList方法中,创建一个新列表,并将_list引用与新列表交换.根据我的想法,任何现有的线程仍将保留对旧列表的引用(这对我来说没问题),任何新线程都将获取新列表.最终,所有线程都将结束,旧列表最终将被垃圾收集.这段代码中是否需要锁定,或者我需要注意什么才能确保安全的多线程访问?

Jon*_*nna 8

为了确保陈旧性和优化都不会伤害您,请使用Interlocked.Exchange()更新字段.然后你会在写入时有一个适当的内存屏障,而不需要花费volatile每次读取.