操作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

原文地址:https://www.cnblogs.com/windy2008/p/2031692.html