c# – 这种通用List线程的使用是否安全
我有一个System.Collections.Generic.List< T>我只在计时器回调中添加项目.仅在操作完成后重新启动计时器.
我有一个System.Collections.Concurrent.ConcurrentQueue< T>它存储上面列表中添加项目的索引.此存储操作也始终在上述相同的计时器回调中执行. 是一个读取操作,它迭代队列并访问列表线程中的相应项目安全吗? 示例代码: private List<Object> items; private ConcurrentQueue<int> queue; private Timer timer; private void callback(object state) { int index = items.Count; items.Add(new object()); if (true)//some condition here queue.Enqueue(index); timer.Change(TimeSpan.FromMilliseconds(500),TimeSpan.FromMilliseconds(-1)); } //This can be called from any thread public IEnumerable<object> AccessItems() { foreach (var index in queue) { yield return items[index]; } } 我的理解: 解决方法
是否记录为线程安全? 如果不是,那么将它视为线程安全是愚蠢的,即使它是偶然的.螺纹安全应该是设计的. 首先在线程之间共享内存是一个坏主意;如果你不这样做,那么你不必询问操作是否是线程安全的. 如果必须这样做,请使用专为共享内存访问而设计的集合. 如果你不能这样做那么使用锁.如果不加协议,锁便宜. 如果您遇到性能问题,因为您的锁始终存在争议,那么通过更改线程体系结构而不是尝试执行低锁代码等危险和愚蠢的操作来解决问题.除少数专家外,没有人能正确编写低锁代码. (我不是其中之一;我也不写低锁代码.)
这是错误的思考方式.正确的思考方式是:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |