2008-10-27 101 views
4

从MSDN文档:为什么要使用Hashtable.Synchronized?

“同步支持多种文字线程,只要没有线程正在阅读的哈希表同步的包装不提供一个或多个读者和一个或多个作家的情况下,线程安全的访问。 “。

来源: http://msdn.microsoft.com/en-us/library/system.collections.hashtable.synchronized.aspx

这听起来像我还得反正使用锁,所以我的问题是,我们为什么要使用Hashtable.Synchronized呢?

+0

在.NET中3.5和更好(我意识到这是一个老问题),这对多个读者和作者是安全的。 – mhenry1384 2015-07-24 19:22:44

回答

3

出于同样的原因,有不同级别的数据库事务。您可能会关心写入是否有保证,但不介意读取陈旧/可能是不正确的数据。


编辑我注意到他们的具体例子是一个枚举器。他们无法在包装中处理这种情况,因为如果你提前中断枚举,包装类将无法知道它可以释放它的锁定。

想一想,而不是柜台的情况。多个线程可以增加表中的值,并且您希望显示计数的值。如果您显示1,200,453并且计数实际上是1,200,454,则无关紧要 - 您只需要关闭它即可。但是,您不希望数据被损坏。这是线程安全对于写入而言非常重要的情况,但不是读取。

+0

当你说“你不希望数据被破坏”时,如果数据被破坏,那该如何看?我认为显示错误的计数是腐败的。 – hmak 2008-10-27 18:22:27

+1

如果Google说有1,200,453页,因为刚刚添加了1,200,454页,并且在请求完成时持有计数的Hashtable条目正在更新,我不认为这是一个问题。 GAE中的分片计数器的概念是基于这个原理的。 – 2008-10-27 18:36:55

1

对于您可以保证在写入数据结构时(或不关心读取错误数据时)没有读者访问数据结构的情况。例如,结构不会一直在被修改,而是您稍后必须访问的一次性计算,虽然它足够大以保证许多线程都可以写入它。

0

你需要它的时候,你是-eaching在一个线程在哈希表(读取)和存在可以从它(写入)添加/删除项/其他线程...