【发布时间】:2021-06-19 15:50:21
【问题描述】:
在这样的 C# 多线程环境中:
public class Indexes
{
private object Lock { get; }
private List<Index> Items { get; set; }
public Indexes()
{
Lock = new object();
Items = new List<Index>();
}
public void Add(Index item)
{
lock (Lock)
{
Items.Add(item);
}
}
public void Replace(List<Index> items)
{
lock (Lock) // Is locking required here?
{
Items = items;
}
}
}
是否也需要锁定可枚举对象的getter和setter?
【问题讨论】:
-
我不得不问 - 为什么你要更改对象引用而其他线程正在枚举它?
-
有许多内置类型提供各种线程安全组合(例如并发集合与不可变集合)。您是否考虑过寻找已经满足您要求的产品,而不是尝试构建自己的产品。如果找不到,请考虑清楚地描述您的要求是什么。
-
您的代码示例中没有多个线程,因此据我们所知,您根本不需要
lock。您是否确实需要它,如果需要,如何使用它,已经广泛地介绍过了。见重复。如果您发现您的代码使用了lock,但没有按预期工作,请随时发布一个问题,其中包含正确的minimal reproducible example,并详细说明代码的作用,有何不同从你想要什么,以及具体你需要什么帮助。
标签: c# multithreading