Почему не стоит lock-ать строку или публичный объект?
В C# lock работает по объекту-синхронизатору:
lock (sync)
{
// критическая секция
}
Проблема начинается, когда в роли sync используют строку:
lock ("cache")
{
UpdateCache();
}
Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.
В итоге другой код в приложении тоже может случайно заблокироваться на "cache":
lock ("cache")
{
DoSomethingElse();
}
Похожая проблема с публичными объектами:
public object Sync = new();
Любой внешний код может взять этот объект и тоже сделать lock, создавая странные зависания.
Надёжнее держать приватный синхронизатор:
private readonly object _sync = new();
lock (_sync)
{
UpdateCache();
}
Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.
➡️ C# Ready | #совет
В C# lock работает по объекту-синхронизатору:
lock (sync)
{
// критическая секция
}
Проблема начинается, когда в роли sync используют строку:
lock ("cache")
{
UpdateCache();
}
Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.
В итоге другой код в приложении тоже может случайно заблокироваться на "cache":
lock ("cache")
{
DoSomethingElse();
}
Похожая проблема с публичными объектами:
public object Sync = new();
Любой внешний код может взять этот объект и тоже сделать lock, создавая странные зависания.
Надёжнее держать приватный синхронизатор:
private readonly object _sync = new();
lock (_sync)
{
UpdateCache();
}
Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.
➡️ C# Ready | #совет