sadier

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

线程同步问题:static成员与ASP.NET中的Application对象

static变量与asp.net

“由于Aplication,static member是全局变量,而我们是在多线程服务器环境写程序,对他们的使用需要注意线程安全的问题”,这一点我完全同意,对于线程同步的问题,再补充一下:

如果在页面中有对 static 变量的写入操作,应该在代码中进行 Lock ,或者使用原子操作 Interlocked 类。

假如有Application["A"]、Application["B"]、Application["C"],有线程访问Application["A"]其他线程不能访问Application["B"] and Application["C"]。
我对这一点表示怀疑,读取操作应该不会导致 Lock,只有在进行写入的时候才会 Lock。
这一点在 HttpApplicationState 类(Application 对象是 HttpApplicationState 类的一个实例)内部是使用一个 ReadWriteObjectLock 对象来操作的,在读取进行时计数加 1,读取完成时计数减 1,写入是排他的,要等到计数为零才能开始写入,写入过程中会将计数置为 -1,防止其他线程进入读取。

如果使用 Application 对象,仅在 Application 集合中的两个或多个对象之间关系密切的时候,才需要使用 Lock(Application) 或者 Application.Lock() ,其他情况下几乎不需要考虑线程同步的问题。

这样看来,对于一般的操作,Application 对象就足够了。static 成员则更有利于类的逻辑封装和重用。

举个 static 成员使用的例子:一个 WebForm 程序和一个 WinForm 程序,要用到同一份数据,同样需要用到缓存技术,可以使用 static 成员将逻辑封装为一个 class,这个 class 就可以同时用在 WebForm 和 WinForm 当中。

posted on 2004-07-11 19:03  毛小华  阅读(742)  评论(0编辑  收藏  举报