c# - 为什么并行访问和更改 System.Collections.Generic.Dictionary 不会导致异常/崩溃?
问题描述
有人可以解释或指出一些可以向我解释为什么此代码不会引发任何异常的文档:
var d = new Dictionary<object, object>();
System.Threading.Tasks.Parallel.ForEach(new Action[] {
() => {
System.Threading.Tasks.Parallel.For(0, 1024, i => {
d.Add(new object(), new object());
});
},
() => {
System.Threading.Tasks.Parallel.For(0, 1024, i => {
d.TryGetValue(new object(), out _);
});
},
}, a => a());
我尝试在我的 8 核计算机上运行它,期望某些东西会引发有关无效操作或空引用等的异常,但它永远不会。虽然我最终得到了一个元素数量错误的字典,但它如何不会抛出异常和/或崩溃?
解决方案
仅仅因为某些东西不是线程安全的并不意味着从多个线程中使用它会导致它抛出异常。Dictionary<TKey, TValue> 类不是线程安全的,一次只能被一个线程使用。它可能不包括对哪些线程同时访问它的任何检查,因为这太昂贵了。它只是假设一次只有一个线程访问它。
推荐阅读
- python - 内存错误:- 如何使用一个公共 ID 列从一个数据帧到另一个数据帧?
- angular - keycloak-angular :与身份验证相关的事件
- postman - 响应以某种方式编码?
- php - Wordpress:同位素转换按钮什么都不做
- java - 我想知道我的应用程序的活动是否是从 Tasker 调用的
- reactjs - 使用 Nginx 代理多个 create-react-app 静态文件夹
- java - 如何从 Java 中的主类访问 src.test 包或如何从主类运行测试类?
- php - 在 Laravel 中找不到弹性类
- c - int、short、long、long long 的大小?
- azure - Azure 表存储随机返回空值