.NET中静态变量的使用需要注意线程安全问题
俺维护的一个ASP.NET(C#)站点最近出现一个奇怪的问题,就是站点运行的时候,不定期会出现页面信息重复显示的现象,比如同一条新闻标题,会在页面上显示两次。而且这种情况的发生没什么规律可循,偶尔出现,发生之后就必须重启IIS才能恢复。
由于此站点以前一直运行良好,最近换到了新服务器上,才开始出现这样的状况,所以多半是因为运行环境的差异所致。在检查程序代码的时候,突然想到会不会是因为多个线程同时更改代码中的静态变量引起的呢?因为考虑到提升站点性能,所以在一些经常使用但较少修改的数据上使用了静态变量,减少数据库的读取。也就是因为这个原因,在新服务器(双核双CPU)上产生了这个错误。在代码中加入线程安全锁定之后问题解决。
因为此站点以前一直运行在一台单核单CPU的服务器上,所以不存在这个问题。当更换为多CPU后,在多人同时访问的情况下,有可能会出现同一段程序代码在不同CPU上并发执行的情况,从而造成这个错误。
关于线程锁定,可以查看这篇文章: 线程,同步与锁————Lock你到底锁住了谁