Как стать автором
Обновить

Комментарии 7

Где примеры использования? Где side-by-side сравнение кода? Простите, но статья пустая. Что-то там восхваляется, но эти фанфары ничем не подтверждены.

Мне кажется, вы неправильно поняли фичу? 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;
    }
}

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории