我的一个Asp.net(c#)程序中,为了性能考虑,我在数据访问层中把常用的数据表存放在一个公共静态变量中,如下:
public static class DALGlobal
{
public static DataSet GlobalDs;
public static DateTime LastUpdated;
...
} 但由于客户端的并发请求问题,程序就相当于在多线程环境下运行了。这样,如何来保证以上两个静态变量的线程安全性呢?
我的数据访问层是一个静态类,其中全是静态方法。这种静态方法中,就有类似下面这样的代码:
...
GlobalDs.Tables["AAA"].Rows[i][j] = value;
...
LastUpdated = DateTime.Now();
... 我在网上问了下,有人回复说这样来处理:
定义一个静态的对象 static object lockObj 用来加锁
lock(lockObj)
{
...
}
但我不明白为什么是另外定义一个对象来加锁,而不是直接给我要操作的静态变量加锁呢?我的静态类不存在实例化的问题,也要这样处理吗?
public static class DALGlobal
{
public static DataSet GlobalDs;
public static DateTime LastUpdated;
...
} 但由于客户端的并发请求问题,程序就相当于在多线程环境下运行了。这样,如何来保证以上两个静态变量的线程安全性呢?
我的数据访问层是一个静态类,其中全是静态方法。这种静态方法中,就有类似下面这样的代码:
...
GlobalDs.Tables["AAA"].Rows[i][j] = value;
...
LastUpdated = DateTime.Now();
... 我在网上问了下,有人回复说这样来处理:
定义一个静态的对象 static object lockObj 用来加锁
lock(lockObj)
{
...
}
但我不明白为什么是另外定义一个对象来加锁,而不是直接给我要操作的静态变量加锁呢?我的静态类不存在实例化的问题,也要这样处理吗?
{
...
}
这是常用的做法如果直接使用你要操作的静态变量,那么读你的变量本身就要给你的变量加锁,这就死锁了