110,503
社区成员
发帖
与我相关
我的任务
分享
public class Test
{
public static DataTable GetData1()
{
DataTable dt=DAL.GetData();
//一系列操作
return dt;
}
public static DataTable GetData2()
{
DataTable dt=DAL.GetData();
//一系列操作
return dt;
}
}
public class Store
{
public static DataTable dt;
}
public class Test
{
public static DataTable GetData1()
{
Store.dt=DAL.GetData();
//一系列操作
return dt;
}
public static DataTable GetData2()
{
DataTable dt=Store.dt;
//一系列操作
return dt;
}
}
public class Store
{
public static DataTable dt;
}
public class Test
{
public static object obj;
public static DataTable GetData1()
{
DataTable dt= GetDt();
//一系列操作
}
public static DataTable GetData2()
{
DataTable dt= GetDt();
//一系列操作
}
public static DataTable GetDt()
{
lock(obj)
{
if(Store.dt!=null)
{
return Store.dt;
}else
{
Store.dt=DAL.GetData();
return Store.dt;
}
}
}
}
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;
}
}
}
如果要提高一点微不足道的“性能”,可以写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应用恰好“同时”被两个消息处理线程执行到if(Store.dt!=null)
而产生了所谓的“不安全”的幻象结果,那有多大事儿?只不过是可能确实是偶尔多调用了 DAL.GetData()了,这会有多大事儿呢?
我并不是说应该或者不应该lock。而是这里的代码本身是可以容许有瑕疵的,有瑕疵也没什么大不了的。除非你确实将一个由于 Store.dt=DAL.GetData(); 语句被执行了不止一次而产生的bug摆在面前。
注意,我再次强调,我此刻不是在讨论是非问题。而是“用什么方法来保证质量”。我们用“bug的存在性”来评判质量,而不是用编程的洁癖规则来评判。