gpt4 book ai didi

c# - 静态变量是线程安全的吗? C#

转载 作者:IT王子 更新时间:2023-10-29 03:55:30 26 4
gpt4 key购买 nike

我想创建一个存储数据表的类,这将阻止我的应用程序在每次我想要检索它时导入详细信息列表。因此这应该做一次,我相信下面的代码会这样做,但我不确定它是否是线程安全的。

下面的代码位于我的三层应用程序的业务层部分,它向表示层返回一个 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;
}
}

感谢任何帮助,如果有更好的方法来缓存数据表,请告诉我。

更新:

感谢您的意见,如果我理解正确的话,这是建议的方法:

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;
}
}

最佳答案

您似乎只想加载一次并保留对它的引用。您需要注意的是初始化变量(如果它为空)。空检查、锁定和再次空检查称为双重检查锁定,对您来说效果很好。最好提供一个单独的锁定对象,这样您就可以很好地控制锁定的粒度。

请注意,这不会阻止人们改变 DataTable 中的值,它只会阻止人们同时尝试初始化静态成员。

private static readonly object UnitTableLock = new object();
private static DataTable unitTable;
private static bool _ready = false;

public static DataTable GetUnitList()
{
if (!_ready)
{
lock (UnitTableLock)
{
if (!_ready)
{
unitTable = new DataTable; //... etc
System.Threading.Thread.MemoryBarrier();
_ready = true;
}
}
}

return unitTable;
}

只从 GetUnitList 的结果中读取,永远不要写入它。

引用http://en.wikipedia.org/wiki/Double-checked_locking修改

关于c# - 静态变量是线程安全的吗? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com