代码改变世界

Synchronized和SyncRoot与 集合类 的同步

2012-02-22 17:51  追忆似水流年  阅读(343)  评论(0编辑  收藏  举报

在许多的集合类中,都能看到Syncronized静态方法和SyncRoot实例属性,这两个单词的sync就显而易见的说明了是用来实现同步的。集合类通常不是线程安全的,多个读取器可以安全的读取集合.但是对集合的任何修改都将为访问集合的所有线程生成不明确的结果,对于集合类来讲,我们可以使用下面两种方式来避免:

(1) Synchronized 方法,并通过该包装以独占方式访问集合,编译器会自动生成适当的 Monitor.Enter 和 Monitor.Exit 调用

(2) 在访问该集合时对SyncRoot属性使用锁定机制

这两种方式到底有哪些区别的,实际应用时应该使用哪种方法呢?

首先需要明确的是Synchronized 并不能保证枚举的同步,如果没有任何线程在读取 Hashtable,则 Synchronized 支持使用多个写入线程。如果使用一个(或多个)读取器以及一个(或多个)编写器,则同步包装不提供线程安全的访问,也就是说使用这个方法并不能保证枚举的同步,例如,一个线程正在删除或添加集合项,而另一个线程同时进行枚举,这时枚举将会抛出异常。所以,在枚举的时候,你必须明确锁定这个集合。这时就要用到SyncRoot。

什么是SyncRoot呢,可以这样认为,一些集合类自己维护着一个内部的数据结构,而SyncRoot就是这个一个内部对象,如果给了对这个内部数据结构的访问权,那么仅仅锁定集合对象是无用的。此时就要用到SyncLock(ht.SyncRoot)来保证集合的变化。

链接地址:http://www.cnblogs.com/deodara/archive/2008/04/11/1148046.html