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