如果一个线程正在 C# 中的
List<T>
中添加对象,而另一个线程正在修改列表中对象的属性,是否存在冲突的可能性,或者 .NET 在 List<T>
中实现了避免这种情况的机制会发生矛盾的情况吗?
C# 列表不是线程安全的。
.NET Framework 4 在 System.Collections.Concurrent 命名空间中引入了线程安全集合。
您可以使用
ConcurrentBag<T>
代替 List<T>
在并发线程中操作从列表中引用的对象可能会导致对象中关于对象状态的冲突。操作列表中的项目可能会导致集合中的冲突,因为许多事情都是在后台发生的,例如在添加新项目时重新分配缓冲区或复制元素。你必须照顾好两者。对于面向 .NET 4 的列表,您可以使用
System.Collections.Concurrent
命名空间。
通常没有内置保护。有些集合是线程安全的(例如参见https://learn.microsoft.com/en-us/dotnet/api/system.collections.concurrent?view=netframework-4.7.2)和原始集合有一个可以使用的 Synchronized 属性,但默认情况下集合不是线程安全的。