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

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

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

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