Можно ли использовать строку в качестве объекта блокировки?

Мне нужно сделать критическую секцию в области на основе конечного набора строк. Я хочу, чтобы блокировка была разделена для одного и того же экземпляра строки (несколько похоже на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()))
        {
            ...
        }
    }
}

Ответы на вопрос(4)

Ваш ответ на вопрос