zoukankan      html  css  js  c++  java
  • 基础才是重中之重~ConcurrentDictionary让你的多线程代码更优美

    基础才是重中之重~ConcurrentDictionary让你的多线程代码更优美

    ConcurrentDictionary是.net4.0推出的一套线程安全集合里的其中一个,和它一起被发行的还有ConcurrentStack,ConcurrentQueue等类型,它们的单线程版本(线程不安全的,Queue,Stack,Dictionary)我们一定不会陌生,可以说是经常用到,一个类的实例里,有个属性是个字典,我们不加考虑的会用Dictionary,而当这个属性被提升为static静态的(类级别的)时候,我们就要考虑它的线程安全性了,因为它有可能被多个线程同时访问,当然,如果这个对象是只读的,也无所谓线程安全,但如果这个属性是可以被写的,那就需要把它加锁了,这代码我们经常看到:

    lock(obj){
    _dic[key]=value;
    }

    看吧,你的代码会有很我的lock块,不说它是否漂亮,但从性能上看,就不能被接收,我们知道,lock会把其它线程锁在外面,无论是读还是写,都会被锁,性能非常并,微软自己也看到了它的不足,所以才推出了System.Collections.Concurrent集合,在这个命名空间里,开发了一批线程安全的对象,当然内核也类似于lock机制,但小微自己一定是做了不少优化的,这是我们能肯定的,呵呵.

    如果你之前的方法用的都是Dicationary的,那修改也方便,只要利用适配器模式,把它加工一下即可

           private readonly static ConcurrentDictionary<string, T> _dic;
           #region IDictionary<string,ResultType> 成员
    
            public void Add(string key, T value){
                _dic.TryAdd(key, value);
            }
    
            public bool ContainsKey(string key)
            {
                return _dic.ContainsKey(key);
            }
    
            public ICollection<string> Keys
            {
                get { return _dic.Keys; }
            }
    
            public bool Remove(string key)
            {
                T val;
                return _dic.TryRemove(key, out val);
            }
    
            public bool TryGetValue(string key, out T value)
            {
                return _dic.TryGetValue(key, out value);
            }
    
            public ICollection<T> Values
            {
                get { return _dic.Values; }
            }
    
            public T this[string key]
            {
                get
                {
                    return _dic[key];
                }
                set
                {
                    _dic[key] = value;
                }
            }
    
            #endregion
    

    怎么样,没有lock块的代码漂亮了许多吧!

  • 相关阅读:
    Solaris下批量kill掉oracle的session
    我写blog的方式变迁
    filezilla ftp client在win7 下获取ftp目录信息出错解决方法
    GNU System Monitor编译问题
    在vmware的Solaris虚拟机中安装vmtool
    关于golden gate director client的一点点使用总结
    测试 乱弹
    ORM的世界 (再补充)
    Yahoo Konfabulator
    轻量容器和注射依赖 的自实现
  • 原文地址:https://www.cnblogs.com/grj001/p/12223158.html
Copyright © 2011-2022 走看看