SOや他の場所で何百万もの投稿を読んだことで、このトピックがどんどん増えていることは知っていますが、明確な答えはまだ見つかりません。このように見える冗長性に腹を立てている場合は、お詫び申し上げます。
ライトワンス、リードミリオンのリソースがある状況があります。リソースの作成には非常に費用がかかり、書き込みロックの競合も非常に高くなる可能性があります。さらに、これがどのプロセッサで実行されるかを予測できないため、その下にあるメモリモデルがわかりません。.NET 3.5、.NET 4.0、およびMono2.10に組み込まれているアセンブリの3つのバージョンをコンパイルしています。
リソースの競合が高いため、これを可能な限り効率的にする必要があり、少なくとも読み取りにはロックフリーパターンを使用したいと思います。リソースを作成するためのダブルロックチェックパターンは理解していますが、メモリバリアの外側にある_resourceにアクセスするため、(すべてのプロセッサで)機能するかどうかについて意見の相違があります。_resourceフィールドでvolatileを使用する必要がありますか?ReaderWriterLockSlimは、このシナリオにより適していますか?他にどのような質問をする必要がありますか?
if(_resource == null)
{
lock(_locker)
{
if(_resource == null)
{
//create resource here...
}
}
}
さらに、これらの数があります:
if(_resource == null)
{
return _resourceDefault;
}
return _resource.GetSomething();