アイデアは、から値(「データ」)を取得することです
- 変数
- 存在しない場合は、ファイルから
- 存在しない場合は、サーバーから
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
書き込む前に、既存のものを再確認する必要があります。たとえば、通常はパターンシングルトンで使用されるダブルチェックのようにする必要があります。
誰かが私にそれをここで実装する方法を理解させてください?
編集:
string[] _data;
bool[] _isDataLoaded.
EDIT2:
上記のコードは.NET<4.0で使用される可能性があるため、そこでLasyを使用することは許可されていません。私が今持っている唯一の質問は、ダブルチェックロックを使用する場合に備えて、揮発性を使用する必要があるかどうかです。
volatile string[] _data;
volatile bool[] _isDataLoaded.