Вы должны создать отдельный статический объект блокировки и использовать его. НЕ ИСПОЛЬЗУЙТЕ СТРУНУ! Строки автоматически интернируются, и будет только один экземпляр каждой программно объявленной строки, поэтому вы не можете гарантировать эксклюзивный доступ к блокировке.
Вы должны сделать это:
public class A {
private static Object LOCK = new Object();
private static void foo() {
lock(LOCK) {
// Do whatever
}
}
}
(Синтаксис может быть неправильным; я в основном Java-человек, но к C # применяются те же правила блокировки и интернирования строк)
Ключевое слово lock обеспечивает блокировку взаимного исключения: только один поток может заблокировать любой конкретный объект одновременно. Если второй поток вызывает foo
, он будет блокироваться до тех пор, пока первый поток не выйдет из блока блокировки.
Принять домашние сообщения: для статического метода блокировки частной статической переменной. Не блокируйте строки или typeof (...), потому что вы не можете гарантировать, что никто другой не использует этот объект. Всегда блокируйте объект, который, как вы знаете, никто не трогает, делая его закрытым и создавая новый.