.NET - 字典锁定与 ConcurrentDictionary

2023-11-21

我找不到足够的信息ConcurrentDictionary类型,所以我想我应该在这里问一下。

目前,我使用一个Dictionary保存由多个线程(来自线程池,因此没有确切数量的线程)不断访问的所有用户,并且它具有同步访问。

最近发现.NET 4.0中有一套线程安全的集合,看起来很赏心悦目。我想知道“更高效、更容易管理”的选项是什么,因为我可以选择正常的Dictionary具有同步访问,或者具有ConcurrentDictionary这已经是线程安全的了。

参考.NET 4.0ConcurrentDictionary


可以以不同的方式看待线程安全集合与非线程安全集合。

考虑一家没有店员的商店,除了结账处。如果人们不负责任地行事,就会遇到很多问题。例如,假设一位顾客从金字塔罐中取出一个罐头,而一名店员正在建造金字塔,那么一切都会崩溃。或者,如果两个顾客同时购买同一件商品,谁会获胜?会打架吗?这是一个非线程安全集合。有很多方法可以避免问题,但它们都需要某种锁定,或者更确切地说以某种方式显式访问。

另一方面,考虑一家商店,柜台前有一名店员,你只能通过他购物。你排队,向他要一样东西,他把东西还给你,然后你就离开队伍。如果您需要多件商品,每次往返只能领取您记得的商品数量,但您需要小心,避免霸占店员,这会激怒后面排队的其他顾客。

现在考虑一下这一点。在只有一名店员的商店里,如果你一直排到队伍的最前面,问店员“你们有卫生纸吗?”他说“有”,然后你说:“好吧,我”当我知道我需要多少时,我会回复你”,那么当你回到队伍前面时,商店当然可以卖完。线程安全集合无法阻止这种情况。

线程安全集合保证其内部数据结构始终有效,即使是从多个线程访问也是如此。

非线程安全集合不提供任何此类保证。例如,如果您在一个线程上向二叉树添加某些内容,而另一个线程正忙于重新平衡该树,则无法保证该项目会被添加,或者即使该树之后仍然有效,它也可能会被破坏得超出希望。

然而,线程安全集合并不能保证线程上的顺序操作都在其内部数据结构的同一个“快照”上工作,这意味着如果您有如下代码:

if (tree.Count > 0)
    Debug.WriteLine(tree.First().ToString());

你可能会得到一个 NullReferenceException 因为中间tree.Count and tree.First(),另一个线程已经清除了树中剩余的节点,这意味着First()将返回null.

对于这种情况,您要么需要查看相关集合是否有安全的方法来获取您想要的内容,也许您需要重写上面的代码,或者您可能需要锁定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET - 字典锁定与 ConcurrentDictionary 的相关文章

随机推荐

  • Babel 6 regeneratorRuntime 未定义

    我正在尝试在 Babel 6 上从头开始使用 async await 但我得到了regeneratorRuntime没有定义 babelrc 文件 presets es2015 stage 0 package json 文件 devDepe
  • 如何测试 Spring 集成

    我是 Spring 集成的新手 我有 ActiveMQ 有一个 responseQ 因此 当消息到达 responseQ 时 gt painResponseChannel gt Transformer gt processResponseC
  • 获取执行jpql查询后更新的记录数

    如何在执行 jpql 查询后获取更新的记录数 例如 UPDATE Device d SET d name Name WHERE d locationId id Modifying Query UPDATE Device d SET d na
  • 如何阻止 jQuery mobile 的自动页面样式化?

    jQuery Mobile 在加载时自动向页面上的所有元素添加类 这确实弄乱了我页面上的 jQuery UI 小部件 有没有办法阻止 jQuery mobile 自动向我的 HTML 元素添加类 我只想在我的页面上显示一些 jQuery 移
  • MouseBinding 上的 WPF 键盘修饰符

    我正在 WPF 中使用 MVVM 模式 对两者来说都有点新 我想设立一个InputBinding on a CheckBox对应于一个Control Click事件 但没有看到Modifiers财产在MouseBinding元素 这就是我想
  • RabbitMQ - 使用curl从队列中获取消息

    我正在尝试使用rabbitmq的HTTP API从队列中获取一些消息 我正在关注中的文档here我没有vhost配置 我尝试了以下curl命令 curl i u guest guest H content type application
  • 使用QSignalMapper时如何保留源信号的参数?

    我遇到了一个问题 我需要保留映射的源信号的参数 到目前为止 我只找到了没有任何参数的映射信号的示例 例如 clicked 信号 signalMapper new QSignalMapper this signalMapper gt setM
  • 如何使用 Devise Authentication 来验证注册电子邮件地址是否来自特定域?

    我想确保只有具有特定域的电子邮件地址的人才能注册使用 Devise 的网站 例如 如果人们使用电子邮件注册 电子邮件受保护 他们应该会收到一封确认电子邮件 但如果注册的是 电子邮件受保护 他们应该会收到错误消息 取消注释 config in
  • 如何编写带有迭代器的 Rust 函数?

    我想编写一个接受迭代器并返回对其进行某些操作的结果的函数 具体来说 我试图迭代 a 的值HashMap use std collections HashMap fn find min lt a gt vals Iterator
  • PHP:这些日期(差异?)格式参数是什么(例如%R%a)

    我遇到了一些例子 人们共享计算两天之间差异的代码 Eg now new DateTime itemDate gt diff now gt format r a 但几乎总是这些类型的帖子并没有真正解释格式参数的含义 我对常规日期格式参数没问题
  • JContainer、JObject、JToken 和 Linq 混淆

    我无法理解何时使用JContainer JObject and JToken 我从 标准 中了解到JObject由 组成JProperties然后JToken是所有的基本抽象类JToken类型 但我不明白JContainer 我正在使用 C
  • 带双引号、单引号和不带引号的假设

    在bash中 使用双引号 echo Globbing is never done echo variable Variable expansion is always done echo command command expansion
  • 从 Hibernate hbm.xml 转换为注释

    我有一个相当大的程序 它使用 Hibernate 来满足其 ORM 需求 由于该项目的年龄 它使用 hbm xml 来配置它 我想将其转换为注释 但我需要花费几天 几周 来手动添加注释 然后测试所有内容 有没有任何工具可以帮助实现这一点 我
  • 如何从 UIAlertView 获取输入?

    我想使用 UIAlertView 将玩家名称作为输入 是否可以在 UIAlertView 上添加 textField 从 iOS 5 开始 UIAlertView 提供了这一点 将alertViewStyle 属性更改为以下之一 UIAle
  • C# 根据下载请求动态重命名文件

    尝试下载时是否可以重命名文件 例如 我想使用文件的 ID 将文件存储到文件夹中 但是当用户下载文件时我想返回原始文件名 只需在这里更改文件名即可 Response AppendHeader Content Disposition attac
  • 从 jenkins 构建 git 项目时,它显示错误,例如找不到任何要构建的修订版本

    尝试通过 jenkins 构建 git 项目时出现错误 错误 找不到任何要构建的修订版 验证此作业的存储库和分支配置 完成 失败 此错误意味着什么以及我应该如何删除它 我确认 一个空的仓库没有 HEAD 也没有分支 我在 为什么我需要显式推
  • 如何使用 C# 调用接收 Delphi 开放数组参数的函数?

    如何将 Delphi 代码转换为 C 代码 这需要一个array of Byte 但我不确定 C 的等价物是什么 我的尝试不起作用并引发 AccessViolationException 等异常 Delphi function SetLev
  • 为什么我没有看到 System.Delegate 上重载的 += 运算符?

    我看到相等比较运算符 and 超载于System Delegate and MulticastDelegate但不是 and 运营商 那么增量赋值和减量赋值运算符如何在委托实例上工作呢 C 编译器翻译 调用静态方法的运算符Delegate
  • 在facet_grid 的小平面之间绘制线条

    Intro 我想在多面 ggplot 之间画线 主要目标是将这些测量结果与我们要测试的线连接起来 所以基本上我想在 ggplot 箱线图 或任何类型的图 的内部和之间插入某种重要性条 Research ggsignif 我知道有ggsign
  • .NET - 字典锁定与 ConcurrentDictionary

    我找不到足够的信息ConcurrentDictionary类型 所以我想我应该在这里问一下 目前 我使用一个Dictionary保存由多个线程 来自线程池 因此没有确切数量的线程 不断访问的所有用户 并且它具有同步访问 最近发现 NET 4