【发布时间】:2011-08-04 12:11:24
【问题描述】:
我想创建一个存储 DataTables 的类,这将阻止我的应用程序在每次我想检索它时导入详细信息列表。因此这应该做一次,我相信下面的代码会这样做,但我不确定它是否是线程安全的。
下面的代码在我的三层应用程序的业务层部分,它将一个 DataTable 返回到表示层。
public class BusinessLayerHandler
{
public static DataTable unitTable;
public static DataTable currencyTable;
public static DataTable GetUnitList()
{
//import lists each time the application is run
unitTable = null;
if (unitTable == null)
{
return unitTable = DatabaseHandler.GetUnitList();
}
else
{
return unitTable;
}
}
public static DataTable GetCurrencyList()
{
//import lists each time the application is run
currencyTable = null;
if (currencyTable == null)
{
return currencyTable = DatabaseHandler.GetCurrencyList();
}
else
{
return currencyTable;
}
}
感谢任何帮助,如果有更好的方法来缓存 DataTable,请告诉我。
更新:
感谢您的意见,如果我理解正确,这是建议的方法:
public class BusinessLayerHandler
{
private static DataTable unitTable;
private static DataTable currencyTable;
private static readonly object unitTableLock = new object();
private static readonly object currencyTableLock = new object();
public static DataTable GetUnitList()
{
//import lists each time the application is run
//unitTable = null;
lock (unitTableLock)
{
if (unitTable == null)
{
return unitTable = DatabaseHandler.GetUnitList();
}
}
return unitTable;
}
public static DataTable GetCurrencyList()
{
//import lists each time the application is run
lock (currencyTableLock)
{
if (currencyTable == null)
{
return currencyTable = DatabaseHandler.GetCurrencyList();
}
}
return currencyTable;
}
}
【问题讨论】:
-
默认情况下没有线程安全的。必须将某些东西设计为线程安全的。所以它不可能(至少没有重新设计静态变量是什么)使静态变量线程安全。如前所述,您可以使用线程安全的设计选择并使用静态变量(这不是您的问题)。
-
@Ramhound 不完全正确,原子操作在某种意义上是线程安全的。但是,我确信我的陈述存在很多小问题 :-) 波动性浮现在脑海中。
-
我也会将内部引用设为私有,它们可能不会被初始化。您希望每次调用都通过检查 null 的方法。 (我个人会做一个方法的 get insetad。你什么都不做。)
-
@Ryan 不要将方法中的变量设为空。当您在锁定上下文中时,再进行一次空值检查 - 请参阅我的回答,了解我认为您是如何做到最好的。