首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dotnet 警惕 ConcurrentDictionary 使用 FirstOrDefault 获取到非预期的首

本文记录在 ConcurrentDictionary 使用 FirstOrDefault 获取到非预期的首的问题 在 dotnet 里面,无论是对 List 列表,还是 Dictionary 字典等获取...在 ConcurrentDictionary 里面如果使用 FirstOrDefault 方法,则随机获取到字典里面的一,但对相同的一个 ConcurrentDictionary 对象多次调用 FirstOrDefault...方法,在不更改 ConcurrentDictionary 内容的情况下,可以稳定获取到相同的首元素对象 简单来说就是在 ConcurrentDictionary 里面,调用 FirstOrDefault...,字典里面存放的顺序和传入的 Key 对象的 Hash 有关,调用 FirstOrDefault 方法时获取到的是里面的 Table 字典的按照内存空间顺序的首 由此原理即可知道,使用 FirstOrDefault...获取 ConcurrentDictionary 的首现是无法确保获取到的是首个加入字典的元素对象。

23010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# ConcurrentBag的实现原理

    开始笔者是使用lock关键字,进行线程同步,但是性能并不是特别理想,然后有网友说可以使用SynchronizedList来代替使用List达到线程安全的目的。...m_stealCount++; } result = tail.m_value; } /// /// 获取总计列表计数...ConcurrentBag 如何实现迭代器模式 看完上面的代码后,我很好奇ConcurrentBag是如何实现IEnumerator来实现迭代访问的,因为ConcurrentBag是通过分散在不同线程的...); // 等待所有操作完成 WaitAllOperations(); }/// /// 本地帮助器函数返回列表的包, 这主要由 CopyTo 和 ToArray 使用...然后获取所有线程ThreadLocalList的锁,通过`AcquireAllLocks()方法来遍历获取。这样其它线程就不能对它进行操作损坏数据。

    69010

    线程安全的字典ConcurrentDictionary

    解决方案 .NET 框架ConcurrentDictionary 类型就是数据结构的宝藏。它是线程安全的,混用细粒度锁和无锁技术,确保能在大多数场景快速访问。...但是,一旦学会了本节的基础知识,就会发现 ConcurrentDictionary 是非常实用的集合类型。 首先来看如何对集合写入值。...第 1 个参数是键,第 2 个参数是委托,通过委托将键(本例为 0)转换为待添加至字典的值(本例为“Zero”)。只有当字典不存在该键时,才会调用该委托。...这意味着委托应该只创建值,而不改变应用程序的任意其他变量。所有传入 ConcurrentDictionary 的方法的委托,都同样遵循该原则。...ConcurrentDictionary 并非唯一的线程安全集合,BCL 也提供了 ConcurrentStack、ConcurrentQueue 以及 ConcurrentBag

    7.2K20

    面试加分-HashMap源码这些常量设计目的你知道吗

    前言 之前周会技术分享,一位同事讲解了HashMap的源码,涉及到一些常量设计的目的,本文将谈谈这些常量为何这样设计,希望大家有所收获。...这个回答解释:一个bucket空和非空的概率为0.5,通过牛顿二式等数学计算,得到这个loadfactor的值为log(2),约等于0.693。...当添加元素的时候,如果桶链表元素超过8,会自动转为红黑树。那么阀值为什么是8呢?...在随机哈希码情况下,对于默认0.75的加载因子,桶节点的分布频率服从参数为0.5的泊松分布,即使粒度调整会产生较大方差。...为什么java Hashmap 的加载因子是默认为0.75 为什么HashMap链表长度超过8会转换成红黑树 What is the significance of load factor in HashMap

    53610

    获取 nginx 日志请求 IP 统计数,设置 IP 流量限制

    uniq -c:统计每个唯一的IP地址出现的次数,并在前面显示计数。 sort -nr:按照计数值进行逆序排序,从高到低排列。 head -n 50:只显示前50行结果,即前50个IP地址。...循环统计多个压缩文件 提问:给我循环查看多个压缩文件的日志并循环输出每个文件的统计数据 要循环查看多个压缩文件的日志并输出每个文件的统计数据,您可以使用一个简单的Shell脚本来实现。...最后,它会输出当前文件的统计数据并进行换行。 运行该脚本后,您将逐个处理每个压缩日志文件,并输出每个文件的统计数据。...最后,它会输出当前文件的统计数据并进行换行。 请确保在脚本设置正确的日志文件夹路径以及开始和结束日期。运行该脚本后,将循环处理指定日期范围内的所有日志文件,并输出每个文件的统计数据。...提交并发请求任务 futures = [executor.submit(send_request, url) for _ in range(concurrent_requests)] # 获取响应结果

    98620

    .NET Core多线程 (4) 锁机制

    首先,编译器要求lock的所对象必须是引用类型。 其次,因为lock会用到对象头中的同步块索引来进行同步,值类型没有堆的数据。...例如:ConcurrentBag就是一个好的例子。...ConcurrentBag  对应非线程安全类型:List ConcurrentQueue  对应非线程安全类型:Queue ConcurrentStack  对应非线程安全类型:Stack ConcurrentDictionary...消费者端通过GetConsumingEnumerable()方法阻塞等待发布的消息 ConcurrentDictonary的两个大坑 (1)Values的坑 观察现象 业务场景:自己用ConcurrentDictionary...如何改进 禁止调用Values方法 借助lock + Dictionary实现类似操作避免每次生成新的List集合对象 (2)GetOrAdd的坑 观察现象 业务场景:自己用ConcurrentDictionary

    34040

    ConsurrentDictionary并发字典知多少?

    工作原理 Dictionary 如下图所示,在字典,数组entries用来存储数据,buckets作为桥梁,每次通过hash function获取了key的哈希值后,对这个哈希值进行取余,即hashResult...ConcurrentDictionary ConcurrentDictionary的数据存储类似,只是buckets有个更多的职责,它除了有dictionary的buckets的桥梁的作用外,负责了数据存储...https://github.com/liuzhenyulive/DictionaryMini 数据结构 Node ConcurrentDictionary的每个数据存储在一个Node,它除了存储value...resultingValue = value; return true; } } Get 从Table获取元素的的流程与前文介绍...,我百思不得其解,不知道这么操作的目的,后面在jeo duffy的博客Thread-safety, torn reads, and the like中找到了答案,这样操作时为了防止torn reads

    84620

    快速入门系列--CLR--03泛型集合

    IEnumerable,其可以获取一个IEnumerator迭代器,如果从数据库的角度来看,前者是表,后者是游标,同时这两个接口是唯一具有可变性的集合接口。...接下来介绍具体的集合泛型集合类型,在实际需要根据具体场景选择最适合的集合类型。...(例如,当队列只有一个时,两个线程同时判断它是否有,并且都返回true,这是一个线程执行了出队操作,而另外一个线程在执行出队操作时,将抛出异常,因而需要对验证队列是否有操作和有就出队操作作为一个整体...,需要添加锁) ConcurrentBag,ConcurrentQueue,ConcurrentStack,它们是对IProducerConsumerCollection...ConcurrentDictionary, 实现了IDictionary接口。

    75170

    ConcurrentDictionary 对决 Dictionary+Locking

    虽然 ConcurrentDictionary 的 Node 分配要慢些,我也没有尝试将 1 亿个数据放入其中来测试时间。因为那显然很花费时间。 但大部分情况下,一个数据被创建后,其总是被读取。...所以,ConcurrentDictionary 赢了这局。 对战第六局:创建消耗不同时间的对象 针对不同数据的创建所消耗的时间不同,将会怎样? 创建多个消耗不同时间的数据,并且并行的添加至字典。...如果我们并不关心是否在并行的创建对象,或者其中的一些已经被丢弃,我们可以加锁,用来检测该数据是否已经存在,然后释放锁,创建数据,按后再获取锁,再次检查数据是否存在,如果不存在,则添加该数据。...字典类型配合完全锁已经比获取一个读写锁的读锁快很多了。当然,这也依赖于在一个锁创建对象所消耗的时间。...所以,要是 Dictionary 类有目的性的使用了更加复杂的算法来处理,ConcurrentDictionary 将如何保证在多线程环境下表现的更好呢?

    1.6K70

    Java 数据持久化系列之 HikariCP (一)

    优化并精简字节码 这里需要声明一误区,并不是使用字节码技术使得代码性能更好。HikariCP 使用字节码技术的目的是减少重复代码的编辑工作,生成统一的代码逻辑。...// 本地变量0加载值,放入操作数栈,也就是 this 5: getfield #3 // 获取成员变量 delegate 放入操作数栈,使用操作栈的 this...ConcurrentBag:更好的并发集合类实现 ConcurrentBag 的实现借鉴于C#的同名类,是一个专门为连接池设计的lock-less集合,实现了比 LinkedBlockingQueue...ConcurrentBag 采用了 queue-stealing 的机制获取元素,首先尝试从 ThreadLocal 获取属于当前线程的元素来避免锁竞争,如果没有可用元素则再次从共享的 CopyOnWriteArrayList...获取

    1.1K00

    如何在 WPF 获取所有已经显式赋过值的依赖属性

    获取 WPF 的依赖属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?...如果是 CLR 属性,我们可以自己写判断条件,然而依赖属性没有自己写判断条件的地方。 本文介绍如何获取以及显式赋值过的依赖属性。...---- 需要用到 DependencyObject.GetLocalValueEnumerator() 方法来获得一个可以遍历所有依赖属性本地值。...因此,你不能在这里获取到常规方法获取到的依赖属性的真实类型的值。 但是,此枚举拿到的所有依赖属性的值都是此依赖对象已经赋值过的依赖属性的本地值。如果没有赋值过,将不会在这里的遍历中出现。...欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    18340
    领券