我與後端系統進行接口連接,在這種系統中,我永遠不會有與給定對象(由其數字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 2012-02-15 19:08:12