LUKIYA'S NEVERLAND

春去秋来,花谢花开。


以前写过两篇关于使用lock解决多线程环境下共享资源访问冲突的文章。最近对此话题有了更深的了解,记录下来以备参考。
 
 System.Web.Caching这个Namespace里有一个Cache类,很常用,对提高访问速度有很大的作用。但是,我们注意到,在MSDN里,对Page类有这么一句描述:
 
此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。
 
所以,可以得出这个结论,HttpRuntime.Cache是线程安全的,但是页面的Cache属性就需要注意了。
 
在雷神的开发维护周期中,始终存在着程序池启动的时候会死掉的问题,在上一次讨论线程安全话题时,我发现自己没有对静态变量缓存进行lock操作。这是很大的失误,已经修正。
 
但是在后来的运行中,虽然程序池崩溃的现象减少了,可依然时不时会发生,百思不得其解。今天在研究了大量英文文档、参考资料。上CSDN求助后,终于发现了问题的所在。
 
那就是我过于信赖MSDN上关于Cache类的描述,说是线程安全的,而忽略了其作为静态变量和非静态变量的区别。
 
此次修正,给所有的页面Cache属性操作也加上了Double Check和Lock保护,经过测试,So far so good。
 
希望就是这个原因,继续观望中。