.NET中静态变量的使用需要注意线程安全问题
2007-01-31 23:32
741 查看
俺维护的一个ASP.NET(C#)站点最近出现一个奇怪的问题,就是站点运行的时候,不定期会出现页面信息重复显示的现象,比如同一条新闻标题,会在页面上显示两次。而且这种情况的发生没什么规律可循,偶尔出现,发生之后就必须重启IIS才能恢复。
由于此站点以前一直运行良好,最近换到了新服务器上,才开始出现这样的状况,所以多半是因为运行环境的差异所致。在检查程序代码的时候,突然想到会不会是因为多个线程同时更改代码中的静态变量引起的呢?因为考虑到提升站点性能,所以在一些经常使用但较少修改的数据上使用了静态变量,减少数据库的读取。也就是因为这个原因,在新服务器(双核双CPU)上产生了这个错误。在代码中加入线程安全锁定之后问题解决。
因为此站点以前一直运行在一台单核单CPU的服务器上,所以不存在这个问题。当更换为多CPU后,在多人同时访问的情况下,有可能会出现同一段程序代码在不同CPU上并发执行的情况,从而造成这个错误。
关于线程锁定,可以查看这篇文章: 线程,同步与锁————Lock你到底锁住了谁
由于此站点以前一直运行良好,最近换到了新服务器上,才开始出现这样的状况,所以多半是因为运行环境的差异所致。在检查程序代码的时候,突然想到会不会是因为多个线程同时更改代码中的静态变量引起的呢?因为考虑到提升站点性能,所以在一些经常使用但较少修改的数据上使用了静态变量,减少数据库的读取。也就是因为这个原因,在新服务器(双核双CPU)上产生了这个错误。在代码中加入线程安全锁定之后问题解决。
因为此站点以前一直运行在一台单核单CPU的服务器上,所以不存在这个问题。当更换为多CPU后,在多人同时访问的情况下,有可能会出现同一段程序代码在不同CPU上并发执行的情况,从而造成这个错误。
关于线程锁定,可以查看这篇文章: 线程,同步与锁————Lock你到底锁住了谁
相关文章推荐
- Qt 多线程与数据库操作需要注意的几点问题(QSqlDatabase对象只能在当前线程里使用)
- 在使用.NET 加解密需要注意的问题
- 缓存需要注意的问题以及使用.net正则替换字符串的方法
- 使用Redis需要注意的数据安全问题
- •在使用微软提供的安全模版(安全策略)时需要注意的安全问题-(2013/09/18)
- 在使用微软提供的安全模版(安全策略)时需要注意的安全问题
- 使用线程时应注意的安全问题
- 使用ACE_Message_Block需要注意的问题
- struts中Action的线程安全与实例变量和静态变量的共享问题
- vector使用需要注意的一些问题
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- 使用svn需要注意的问题
- 在BCB中使用JSONCPP需要注意的问题
- 使用IOCP需要注意的一些问题~~(不断补充)
- 【转载】HttpSession的线程安全问题及注意事项
- Hibernate使用二级缓存时,createSQLQuery需要注意的问题
- Hibernate使用二级缓存时,createSQLQuery需要注意的问题
- 使用PreparedStatement的execute方法需要注意的问题
- 跨dll使用template/STL需要注意的问题