- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
ConcurrentQueue
有 TryDequeue
方法。
Queue
只有 Dequeue
方法。
ConcurrentDictionary
中没有Add
方法,但我们有TryAdd
方法。
我的问题是:
这些并发收集方法有什么区别?为什么它们对于并发集合不同?
最佳答案
用Dictionary<TKey, TValue>
假定您要实现自己的逻辑以确保不输入重复键。例如,
if(!myDictionary.ContainsKey(key)) myDictionary.Add(key, value);
但是当我们有多个线程运行时,我们会使用并发集合,并且它们可能同时尝试修改字典。
如果两个线程试图同时执行上面的代码,有可能myDictionary.ContainsKey(key)
可能会为两个线程返回 false,因为它们同时进行检查并且尚未添加该 key 。然后他们都尝试添加 key ,但其中一个失败了。
阅读该代码但不知道它是多线程的人可能会感到困惑。在我添加它之前,我检查以确保该键不在字典中。。那么我如何获得异常呢?
ConcurrentDictionary.TryAdd
通过允许您“尝试”添加 key 来解决这个问题。如果它添加它返回的值 true
.如果不是,则返回 false
.但它不会做的是与另一个 TryAdd
发生冲突。并抛出异常。
您可以通过包装 Dictionary
来自己完成所有这些工作在类里面并投入lock
围绕它的语句以确保一次只有一个线程进行更改。 ConcurrentDictionary
只是为你做,而且做得很好。您不必查看其工作原理的所有详细信息 - 您只需在知道多线程已被考虑在内的情况下使用它即可。
这是在多线程应用程序中使用类时要查找的详细信息。如果您查看 ConcurrentDictionary Class 的文档滚动到底部你会看到这个:
Thread Safety
All public and protected members of ConcurrentDictionary are thread-safe and may be used concurrently from multiple threads. However, members accessed through one of the interfaces the ConcurrentDictionary implements, including extension methods, are not guaranteed to be thread safe and may need to be synchronized by the caller.
换句话说,多个线程可以安全地读取和修改集合。
下Dictionary Class你会看到这个:
Thread Safety
A Dictionary can support multiple readers concurrently, as long as the collection is not modified. Even so, enumerating through a collection is intrinsically not a thread-safe procedure. In the rare case where an enumeration contends with write accesses, the collection must be locked during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing, you must implement your own synchronization.
多个线程可以读取 key ,但是如果多个线程要写入 那么您需要以某种方式lock
确保一次只有一个线程尝试更新的字典。
Dictionary<TKey, TValue>
公开一个 Keys
收藏与Values
collection 以便您可以枚举键和值,但是如果另一个线程将要修改字典,它会警告您不要尝试这样做。在添加或删除项目时,您无法枚举某些内容。如果您需要遍历键或值,则必须锁定字典以防止在该迭代期间进行更新。
ConcurrentDictionary<TKey, TValue>
假设会有多个线程读写,所以它甚至不会公开键或值集合供您枚举。
关于c# - 为什么 ConcurrentQueue 和 ConcurrentDictionary 有 "Try"方法——TryAdd、TryDequeue——而不是 Add 和 Dequeue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38396477/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!