C#使用lock锁定静态变量


http://bbs.csdn.net/topics/391055599


(一)

如果简写,那么可以写:

C# code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  Store
{
     private  static  DataTable dt;
     public  static  object  dtFlag =  new  object ();
 
     public  static  DataTable GetDt()
     {
         lock  (dtFlag)
         {
             if  (dt ==  null )
                 dt = DAL.GetData();
             return  dt;
         }
     }
}


如果要提高一点微不足道的“性能”,可以写
C# code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  class  Store
{
     private  static  DataTable dt;
     public  static  object  dtFlag =  new  object ();
 
     public  static  DataTable GetDt()
     {
         if  (dt !=  null )
             return  dt;
 
         lock  (dtFlag)
         {
             if  (dt ==  null )
                 dt = DAL.GetData();
             return  dt;
         }
     }
}
但是这种改进确实应该是“微不足道”的,它对一个应用程序(即使是非常频繁地并发访问)的用户体验基本上感觉不出来一丝一毫。

这就引出了回答上面的你在#2楼的这个问题。实际上,就算不lock,就算是你的asp.net应用恰好“同时”被两个消息处理线程执行到
C# code ?
1
if (Store.dt!= null )
而产生了所谓的“不安全”的幻象结果,那有多大事儿?只不过是可能确实是偶尔多调用了 DAL.GetData()了,这会有多大事儿呢?

我并不是说应该或者不应该lock。而是这里的代码本身是可以容许有瑕疵的,有瑕疵也没什么大不了的。除非你确实将一个由于 Store.dt=DAL.GetData(); 语句被执行了不止一次而产生的bug摆在面前。

注意,我再次强调,我此刻不是在讨论是非问题。而是“用什么方法来保证质量”。我们用“bug的存在性”来评判质量,而不是用编程的洁癖规则来评判。





(二)

webform和winform的编程思路完全不同的
winform就是一个人在用,在自己的电脑内存里,不会有别的用户的数据
而webform是个网站,它天生是多线程,是服务端和客户端的通信程序
在webform里,static类型是所有线程公用的,那么就会出现所有用户的数据互相错乱的现象
所以除非是所有用户公用的数据(比如数据库连接字符串),否则不要放到static类型的变量里去






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值