私は特定のオブジェクト(数値IDで識別される)に対して複数のオープン接続を持つことは絶対にありませんが、異なるコンシューマがそれらを開いたり閉じたりすることがあるバックエンドシステムとインタフェースしています互いに独立している。ここでの問題で、今ファクトリメソッドでロックする
private Dictionary<ulong, IFoo> _openItems = new Dictionary<ulong, IFoo>();
private object _locker = new object();
public IFoo Open(ulong id)
{
lock (_locker)
{
if (!_openItems.ContainsKey(id))
{
_openItems[id] = _nativeResource.Open(id);
}
_openItems[id].RefCount++;
return _openItems[id];
}
}
public void Close(ulong id)
{
lock (_locker)
{
if (_openItems.ContainsKey(id))
{
_openItems[id].RefCount--;
if (_openItems[id].RefCount == 0)
{
_nativeResource.Close(id);
_openItems.Remove(id);
}
}
}
}
:
は大雑把に、私はこのようなファクトリクラスのフラグメントを持っています。私の場合、_nativeResource.Openはです。非常にです。ここでのロックはむしろ素朴で、同時の.Open呼び出しの数が多い場合は、(おそらく)異なるIDを参照していて重複していなくても非常に遅くなる可能性があります。特に、_openItemsキャッシュ。
ロックを構成して、特定のIDへの同時アクセスを防止し、すべての発信者に防ぐことはできません。
グローバルオブジェクト_lockerにないIDをロックしたいとします。単一のIDに対応するオブジェクトを見つけようとします。可能であれば、独自のオブジェクトセットを構築します。 – mathk