• 操作Static对象的多线程问题


         这两天在Wcf中使用Static List泛型对象保存了一个经常使用的一个SharePoint列表对象(大概2000条数据吧),可是这个列表有可能经常更新,所以

    就设定每天读取一次。使用该List的控件在一个地方使用一切正常,可是当这个控件也在其它地方使用时,就出现了多个重复的对象。由于数据每天更新

    ,想有可能是重复数据问题,可是检查了下,不是这个问题。原来是多线程造成的。
         可是也怪,一个地方用到这个控件,在多人使用的情况下,只产生一个线程,不会出现重复的现象。就想到是多线程造成该问题,决定在这个方法内加

    个锁Lock,每次添加的时候,先加锁。
         private static object lockObj = new object();
         private static List<SPS> SPSList = new List<SPS>();
         lock(lockObj)
         {
             SPSList.clear();
             SPSList.Add(sps); ... //这个会添加2000多条记录。
         }
          这样解决了重复的问题,可是我不想让同事执行该操作的人,有等待的过程,因为WCF等待时间过长会有超时的异常发生。看来Lock这个语法糖满足不了

    要求了,就直接用Monitor来解决(实际上lock是对Monitor类的包装),解决的代码如下:
         if(Monitor.TryEnter(lockObj))
         {
             SPSList.clear();
             SPSList.Add(sps); ... //这个会添加2000多条记录。
             Monitor.Exit(lockObj);
         }
         else
         {
             return SPSList;
         }
         上面的代码解决了线程在执行添加操作的时候,不耽误别的线程读取数据。可是又有新问题了,因为数据量比较大,操作时间比较长,有时在执行了

    clear()后,数据还没添加完,就被别的线程拿去用了。就像到了,先把数据放到一个变量里,添加完数据后,再赋值给清空的SPSList。

    出处: http://www.cnblogs.com/windy2008

  • 相关阅读:
    CPU使用率100%的一个原因
    Oracle 9.2.0.1升级到9.2.0.5
    Javacript同样的意思,更巧的写法
    前端面试题
    Linux shell
    vi/vim 光标移动命令
    CSS 中的分离、抽象和层叠
    practice first开张
    Linux下访问Windows的方法(原)
    Evolution收发Gmail邮件
  • 原文地址:https://www.cnblogs.com/windy2008/p/2031692.html
Copyright © 2020-2023  润新知