Synchronized和SyncRoot与集合类的同步

来源:互联网 发布:网络小本创业 编辑:程序博客网 时间:2024/04/19 14:30

???? 在许多的集合类中,都能看到Syncronized静态方法和SyncRoot实例属性,这两个单词的sync就显而易见的说明了是用来实现同步的,那么,它们内在的机制是什么?

???? Syncronized方法用来创造一个新的对象的线程安全包装,例如:

???????? HashTable ht = HashTable.Syncronized(new HashTable());

???? 使用这个方法创造的ht对象保证了在多线程环境下,进行对象的添加、删除和解析的时候,系统自动为它创建锁定区域,这样,省去了手工进行线程安全的设置。

???? 但是,使用这个方法并不能保证枚举的同步,例如,一个线程正在删除或添加集合项,而另一个线程同时进行枚举,这时枚举将会抛出异常。所以,在枚举的时候,你必须明确锁定这个集合。这是,我们要锁定并不是集合类对象本身,我们要锁定的是它的SyncRoot对象,这是为什么呢?

????? 举例来说,一个集合类将数据存放在某些类型的内部数据结构,如果,这个类给予这个外面对这个数据结构的访问权,那么仅仅锁定集合对象是无用的,当然,大部分情况下,返回的SyncRoot就是它本身,但是,还是有一些例外,所以,我们如果我们并不能确定集合对象和SyncRoot之间的关系,那么我们还是锁定SyncRoot为最佳选择;

???????? lock(ht.SyncRoot)

?????? {

???????????? //你可以安全的对ht进行枚举了

???????? }