首页 / C# / c# – 以下线程是否安全?
c# – 以下线程是否安全?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 以下线程是否安全?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1226字,纯文字阅读大概需要2分钟。
内容图文
![c# – 以下线程是否安全?](/upload/InfoBanner/zyjiaocheng/780/af93199fb2b94146bf65c5776d275aa4.jpg)
我有以下代码,并想知道它是否是线程安全的.我只在我从集合中添加或删除项目时锁定,但在迭代集合时不锁定.迭代时锁定会严重影响性能,因为该集合可能包含数十万个项目.有什么建议可以使这个线程安全吗?
谢谢
public class Item
{
public string DataPoint { get; private set; }
public Item(string dataPoint)
{
DataPoint = dataPoint;
}
}
public class Test
{
private List<Item> _items;
private readonly object myListLock = new object();
public Test()
{
_items = new List<Item>();
}
public void Subscribe(Item item)
{
lock (myListLock)
{
if (!_items.Contains(item))
{
_items.Add(item);
}
}
}
public void Unsubscribe(Item item)
{
lock (myListLock)
{
if (_items.Contains(item))
{
_items.Remove(item);
}
}
}
public void Iterate()
{
foreach (var item in _items)
{
var dp = item.DataPoint;
}
}
}
编辑
我很好奇,并且再次在未锁定的迭代与在myListLock上的锁内部迭代之间进行性能分析,并且锁定迭代超过1000万个项目的性能开销实际上非常小.
解决方法:
不,它不是线程安全的,因为当你查看它时可以修改集合……你能做什么:
Item[] items;
lock (myListLock)
{
items = _items.ToArray();
}
foreach (var item in items)
{
var dp = item.DataPoint;
}
所以你在锁之前复制锁中的集合.这显然会使用内存(因为你必须复制List<>)(ConcurrentBag<> .GetEnumerator()几乎就是这样)
请注意,这只有在Item是线程安全的情况下才有效(例如因为它是不可变的)
内容总结
以上是互联网集市为您收集整理的c# – 以下线程是否安全?全部内容,希望文章能够帮你解决c# – 以下线程是否安全?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。