zoukankan      html  css  js  c++  java
  • 操作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

  • 相关阅读:
    Mysql约束
    mysql数据库表的类型介绍
    Python之多进程根据p站画师id爬取
    Python‘最难’的问题——GIL问题
    MySQL数据库操作
    MySQL初识
    进程vs线程
    GIL锁
    Python冷知识
    python3利用smtplib发送、抄送邮件并附带附件
  • 原文地址:https://www.cnblogs.com/windy2008/p/2031692.html
Copyright © 2011-2022 走看看