/
aprogrammer
/
dotnet-docs
Обзор
Документация
Войти
/
aprogrammer
/
dotnet-docs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
docs/csharp/language-reference/statements/snippets/lock/Program.cs
84 строки
2 KB
Bill Wagner
Add language reference for `lock` (#40714)
02 май 2024, 16:52
Не верифицирован
02 май 2024, 16:52
408646c
Код
Авторство
О чём код?
using System; using System.Threading.Tasks; public class Account { // Use `object` in versions earlier than C# 13 private readonly System.Threading.Lock _balanceLock = new(); private decimal _balance; public Account(decimal initialBalance) => _balance = initialBalance; public decimal Debit(decimal amount) { if (amount < 0) { throw new ArgumentOutOfRangeException(nameof(amount), "The debit amount cannot be negative."); } decimal appliedAmount = 0; lock (_balanceLock) { if (_balance >= amount) { _balance -= amount; appliedAmount = amount; } } return appliedAmount; } public void Credit(decimal amount) { if (amount < 0) { throw new ArgumentOutOfRangeException(nameof(amount), "The credit amount cannot be negative."); } lock (_balanceLock) { _balance += amount; } } public decimal GetBalance() { lock (_balanceLock) { return _balance; } } } class AccountTest { static async Task Main() { var account = new Account(1000); var tasks = new Task[100]; for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => Update(account)); } await Task.WhenAll(tasks); Console.WriteLine($"Account's balance is {account.GetBalance()}"); // Output: // Account's balance is 2000 } static void Update(Account account) { decimal[] amounts = [0, 2, -3, 6, -2, -1, 8, -5, 11, -6]; foreach (var amount in amounts) { if (amount >= 0) { account.Credit(amount); } else { account.Debit(Math.Abs(amount)); } } } }