作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 System.Collections.Generic.SynchronizedCollection 共享集合。我们的代码使用 .Net 4.0 Task 库来跨越线程并将同步集合传递给线程。到目前为止,线程还没有在集合中添加或删除项目。但是新要求要求其中一个线程必须从集合中删除项目,而另一个线程只读取集合。从 Collection 中删除项目之前是否需要添加锁?如果是这样,读者线程会是线程安全的吗?或者建议获得线程安全的最佳方法?
最佳答案
不,它不是完全线程安全的。在一个简单的控制台应用程序中尝试以下操作,看看它是如何因异常而崩溃的:
var collection = new SynchronizedCollection<int>();
var n = 0;
Task.Run(
() =>
{
while (true)
{
collection.Add(n++);
Thread.Sleep(5);
}
});
Task.Run(
() =>
{
while (true)
{
Console.WriteLine("Elements in collection: " + collection.Count);
var x = 0;
if (collection.Count % 100 == 0)
{
foreach (var i in collection)
{
Console.WriteLine("They are: " + i);
x++;
if (x == 100)
{
break;
}
}
}
}
});
Console.ReadKey();
请注意,如果您将 SynchronizedCollection 替换为 ConcurrentBag,您将获得线程安全:
var collection = new ConcurrentBag<int>();
SynchronizedCollection 在此应用程序中根本不是线程安全的。请改用并发集合。
关于c# - 同步收集线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548587/
我是一名优秀的程序员,十分优秀!