C# 为什么要使用Hashtable.Synchronized?

C# 为什么要使用Hashtable.Synchronized?,c#,.net,C#,.net,从MSDN文档中: Synchronized支持多个写入线程,前提是没有线程读取哈希表。对于一个或多个读卡器和一个或多个写卡器,Synchronized包装器不提供线程安全访问 资料来源: 听起来我仍然必须使用锁,所以我的问题是为什么我们要使用Hashtable.Synchronized?出于同样的原因,数据库事务有不同的级别。您可能关心写入是有保证的,但不介意读取过时/可能是错误的数据。 编辑我注意到他们的具体示例是枚举器。他们无法在包装器中处理这种情况,因为如果您提前中断枚举,包装器类将

从MSDN文档中:

Synchronized支持多个写入线程,前提是没有线程读取哈希表。对于一个或多个读卡器和一个或多个写卡器,Synchronized包装器不提供线程安全访问

资料来源:


听起来我仍然必须使用锁,所以我的问题是为什么我们要使用Hashtable.Synchronized?

出于同样的原因,数据库事务有不同的级别。您可能关心写入是有保证的,但不介意读取过时/可能是错误的数据。
编辑我注意到他们的具体示例是枚举器。他们无法在包装器中处理这种情况,因为如果您提前中断枚举,包装器类将无法知道它可以释放锁


思考而不是计数器的情况。多个线程可以增加表中的值,并且您希望显示计数的值。如果显示的是1200453,而计数实际上是1200454,这并不重要——您只需要将其关闭即可。但是,您不希望数据损坏。在这种情况下,线程安全对于写入而不是读取非常重要。

对于这样的情况,您可以保证在写入数据结构时(或者您不在乎读取错误数据时),没有读取器会访问数据结构。例如,结构没有被不断修改,而是一个你以后必须访问的一次性计算,尽管它非常庞大,足以保证许多线程都可以写入它。

当你在一个线程(读取)上的哈希表上进行教学时,你会需要它,而其他线程可能会在其中添加/删除项目(写入).

当您说“您不希望数据损坏”如果数据被破坏了,我会怎么看呢?我认为显示错误的计数是腐败的。如果谷歌说有1200453页,因为只添加了第一百二十万零四百五十四页,并且当请求被提出时,保存计数的哈希表条目正被更新,我不认为这是一个问题。GAE中的nters是基于这一原理的。因此,如果我对数据结构有一个锁定,那么所有多线程写入此同步数据结构的最终结果将是相同的最终结果?在.NET 3.5及更高版本中(我意识到这是一个老问题),对于多个读写器来说是安全的。