Комментарии 7
Где примеры использования? Где side-by-side сравнение кода? Простите, но статья пустая. Что-то там восхваляется, но эти фанфары ничем не подтверждены.
А ещё бы сравнение с другими примитивами - семафором, readwrite lock, которые уже есть... Бенчмарки для всех вариантов бы
Мне кажется, вы неправильно поняли фичу? lock никуда не девается, плюшки появляются из-за использования System.Threading.Lock вместо object, а не потому что мы lock вручную переписываем на using, в доке есть пример (подозрительно похожий на ваш ;)
Логично, потому что часто встречался код вида
object dataLock = new object();
List<string> data;
int someOtherData;
void SomeFunc()
{
lock (dataLock) {...}
}
То есть когда объектов несколько, но все они используются одновременно. Конкретный объект лочить как-то нелогично, поэтому создавали object для блокировки.
"в средах с высокой конкуренцией, где требуется частая блокировка и разблокировка, System.Threading.Lock снижает издержки на переключение контекста." - Ла ла ла, дай-ка я на хабр напишу ерунды в пятницу...
Статья от нейросети?
var account = new Account(1000m);
Parallel.For(0, 10, (_) =>
{
for (int j = 0; j++ < 100;)
{
account.Credit(10);
account.Debit(10);
}
});
Console.WriteLine($"Final balance: {account.GetBalance()}");
internal class Account(decimal initialBalance)
{
private decimal _balance = initialBalance;
private readonly Lock _balanceLock = new();
public void Debit(decimal amount)
{
ArgumentOutOfRangeException.ThrowIfNegative(amount, nameof(amount));
lock (_balanceLock)
{
if (_balance < amount)
throw new InvalidOperationException("Insufficient funds");
_balance -= amount;
}
}
public void Credit(decimal amount)
{
ArgumentOutOfRangeException.ThrowIfNegative(amount, nameof(amount));
lock (_balanceLock)
_balance += amount;
}
public decimal GetBalance()
{
lock (_balanceLock)
return _balance;
}
}
Новые возможности .NET 9: новые типы и семантика блокировок в C# 13