这个想法是从
- 一个变量
- 如果不存在,则从文件中
- 如果不存在,则从服务器
public static string LoadData(int id)
{
if (_isDataLoaded[id - 1])
{
return _data[id - 1];
}
if (File.Exists(_fileName))
{
bool dataExists;
string cachedData;
if (GetCachedConstant(id, out cachedData)) //read from a file
{
lock (_locker)
{
_isDataLoaded[id - 1] = true;
_data[id - 1] = cachedData;
}
return _data[id - 1];
}
}
string remoteData = GetFromServer(id);
lock (_locker)
{
CacheToFile(id, remoteData); //write to a file
_data[id - 1] = remoteData;
_isDataLoaded[id - 1] = true;
}
return _data[id - 1];
}
许多线程使用此代码。尽管它看起来是线程安全的,但实际上并非如此。因此,我对其进行了测试,这给了我这个想法并让我确信。_data
写作前应仔细检查现有情况。例如,它应该像通常在模式 Singleton 中使用的双重检查。
有人请让我了解如何在这里实现它?
编辑:
string[] _data;
bool[] _isDataLoaded.
编辑2:
上面的代码可能与 .NET < 4.0 一起使用,因此不允许在那里使用 Lasy。我现在唯一的问题是,我应该使用 volatile 以防我使用双重检查锁定吗?
volatile string[] _data;
volatile bool[] _isDataLoaded.