Можно ли использовать строку в качестве объекта блокировки?
Мне нужно сделать критическую секцию в области на основе конечного набора строк. Я хочу, чтобы блокировка была разделена для одного и того же экземпляра строки (несколько похоже наString.Intern подход).
Я рассматриваю следующую реализацию:
public class Foo
{
private readonly string _s;
private static readonly HashSet<string> _locks = new HashSet<string>();
public Foo(string s)
{
_s = s;
_locks.Add(s);
}
public void LockMethod()
{
lock(_locks.Single(l => l == _s))
{
...
}
}
}
Есть ли проблемы с этим подходом? Можно ли таким образом заблокировать строковый объект, и есть ли какие-либо проблемы с безопасностью потока при использованииHashSet<string>
?
Лучше, например, создатьDictionary<string, object>
что создает новый объект блокировки для каждого экземпляра строки?
Final Implementation
На основе предложений я пошел со следующей реализацией:
public class Foo
{
private readonly string _s;
private static readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
public Foo(string s)
{
_s = s;
}
public void LockMethod()
{
lock(_locks.GetOrAdd(_s, _ => new object()))
{
...
}
}
}