none
Dictionary<>是否为线程安全? RRS feed

  • 问题

  • 最近在做个项目
    没在官方资料上查到Dictionary是否为线程安全的..
    呵呵..来问下...
    3Q了~
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月26日 10:39

答案

  • 你好,

    默认情况下集合不是线程安全的。在System.Collections 命名空间中只有几个类提供Synchronize方法,该方法能够超越集合创建线程安全包装。但是,System.Collections命名空间中的所有类都提供SyncRoot属性,可供派生类创建自己的线程安全包装。还提供了IsSynchronized属性以确定集合是否是线程安全的。但是ICollection泛型接口中不提供同步功能,非泛型接口支持这个功能。

    ICollection接口派生自IEnumerable接口,扩展了集合类元素个数和同步功能,即对多线程安全访问的支持。

    ICollection接口的声明格式如下:
        public interface ICollection : IEnumerable
    {
            int Count { get; }                   //获取集合中的元素个数
            bool IsSynchronized { get; }   //获取是否同步访问的值。
            Object SyncRoot { get; }        //获取用于同步访问的对象。
    }
    所有实现ICollection接口的对象,可以在对集合元素遍历的时候,把集合锁定,以防其它线程对集合的修改。ICollection接口派生了IDictionary和IList两个子接口。

    为了保证在多线程的情况下的线程同步访问安全,微软提供了自动线程同步的HashTable,所以HashTable的泛型版本Dictionary<T>默认不是线程安全的。

    jon.valett@gmail.com
    2009年9月28日 18:03
    版主

全部回复

  • - -
    找到了...
    MSDN下面写着...
    抱歉..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月26日 10:42
  • 泛型都是安全线程

    2009年9月26日 10:54
  • 泛型都是安全线程


    好像不是哟...
    Dictionary貌似不是线程安全的,至少实例成员不是..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月26日 13:36
  • volatile
    这个关键字到底应该怎么用...
    好像是线程安全什么的...
    论坛的老大们给俺说说呗..
    深入点的...
    有权威,细致点的资料也好.

    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月26日 13:40
  • volatile关键字是用于线程安全的。
    因为在某些情况下,即使我们使用了Lock,但是由于C#编译器本身在编译的时候会对指令做一些微调,指令的执行顺序微调之后,还是有可能出现问题。
    但加上 volatile 关键字后将不会重新调整指令,严格按照指令顺序执行。  
    声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制  

    做最好的自己
    2009年9月26日 13:48
  • 泛型都是安全线程


    好像不是哟...
    Dictionary貌似不是线程安全的,至少实例成员不是..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..

    http://www.cnblogs.com/mainz/archive/2008/04/06/1139117.html 参考这个
    2009年9月26日 13:54
  • 泛型都是安全线程


    好像不是哟...
    Dictionary貌似不是线程安全的,至少实例成员不是..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..

    http://www.cnblogs.com/mainz/archive/2008/04/06/1139117.html 参考这个

    额.好像和Dictionary没什么关系呢...
    里面只讲了Hashtable的线程安全....
    MSDN的解释是:

    Public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

    A Dictionary<(Of <(TKey, TValue>)>) 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.
    线程安全的话,还是要自己实现的..
    不知道有没有实现线程安全的类以供使用.


    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月27日 1:09
  • 我看了一下博客园的文章
    大致的意思就是volatile是强制cpu从内存中读取数据,以达到数据实事的目的..
    那么如果给字段加了volatile关键字,对集合的写入操作也不是线程安全的吧?
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月27日 23:41
  • 你可以参考一下这篇文章,希望能帮助到你
    http://dev.csdn.net/develop/article/83/83923.shtm
    http://hi.baidu.com/elvisdvd/blog/item/05c14acd6a56d41901e928d2.html
    http://hi.baidu.com/elvisdvd/blog/item/291492f5cb5f3bd0f2d385d2.html
    做最好的自己
    2009年9月28日 0:43
  • 您好,
    1、Dictionary<>不是线程安全的,需要自己写并发处理,采用lock方式即可。
    2、volatile是取消编译器优化的,它的含义是“易变字段”。通常为了提升性能当代码在对成员字段访问时,如果是多次读,而没有写操作的话,编译器有可能是从缓存中读取,而不是从对象的实际地址读取。这是为了提升性能。
        但,当我们使用多线程时就会有问题,有可能在更新该值,但编译器却有可能还是从缓存中读取,这样就有问题。
        volatile仅可应用于类或结构字段。使用volatile就是告诉编译器这个字段是易变的,这样就不会被缓存。
        不过通常不建议采用volatile关键字,而是用lock来锁当前对象或字段来确保线程的安全操作。
    2009年9月28日 2:18
  • 你好,

    默认情况下集合不是线程安全的。在System.Collections 命名空间中只有几个类提供Synchronize方法,该方法能够超越集合创建线程安全包装。但是,System.Collections命名空间中的所有类都提供SyncRoot属性,可供派生类创建自己的线程安全包装。还提供了IsSynchronized属性以确定集合是否是线程安全的。但是ICollection泛型接口中不提供同步功能,非泛型接口支持这个功能。

    ICollection接口派生自IEnumerable接口,扩展了集合类元素个数和同步功能,即对多线程安全访问的支持。

    ICollection接口的声明格式如下:
        public interface ICollection : IEnumerable
    {
            int Count { get; }                   //获取集合中的元素个数
            bool IsSynchronized { get; }   //获取是否同步访问的值。
            Object SyncRoot { get; }        //获取用于同步访问的对象。
    }
    所有实现ICollection接口的对象,可以在对集合元素遍历的时候,把集合锁定,以防其它线程对集合的修改。ICollection接口派生了IDictionary和IList两个子接口。

    为了保证在多线程的情况下的线程同步访问安全,微软提供了自动线程同步的HashTable,所以HashTable的泛型版本Dictionary<T>默认不是线程安全的。

    jon.valett@gmail.com
    2009年9月28日 18:03
    版主