Что должно быть заблокировано для одной и той же строки?

У меня есть метод, который принимает параметр string, и этот метод будет вызываться одновременно. Я хочу заблокировать вызовы, которые проходят в одной строке. Например, два потока проходят в "abc" для одновременного вызова метода, тогда я надеюсь, что они один за другим. При этом вызов "xyz" из другого потока не затрагивается. Так что мне запирать?

void Foo(string s) {
   lock(what) {} // ???
}

В настоящее время я блокирую String.Intern(s), но я понимаю, что это увеличит несобираемую интернированную строку, и этот метод будет вызываться бесчисленное количество раз путем передачи бесчисленного количества различных строк во время работы приложения, поэтому я хочу его улучшить.


person ahdung    schedule 11.12.2020    source источник
comment
Ознакомьтесь с ответом здесь для кода, который будет блокировать определенное значение stackoverflow.com/a/31194647/302918   -  person juharr    schedule 11.12.2020
comment
@Enigmativity Я думаю, что этот вопрос является более подходящим дубликатом (чем this), потому что он явно запрашивает удаление неиспользуемых блокировок из памяти и относится к синхронной блокировке. Использование асинхронных шкафчиков синхронно добавляет накладные расходы, не предлагая ничего взамен.   -  person Theodor Zoulias    schedule 11.12.2020