C # Создание глобального номера, который увеличивается на 1 - PullRequest
0 голосов
/ 18 февраля 2019

Я пишу простую программу обучения банковскому счету.Для каждого нового зарегистрированного клиента номер счета будет увеличиваться на 1 для нового идентификатора.Я видел пример в книге "C # Mueller".Мне просто любопытно, если это правильный способ для этого, как он будет обрабатывать параллельные регистрации?Есть ли лучше справиться с этим, может быть, с помощью синглетонов или глобальных переменных, кеш-память?Как бы этот элемент обрабатывался в реальном приложении?

public class BankAccount
{
    private static int _nextAccountNumber = 1000;
    private int _accountNumber;

    private double _balance;

    public void InitBankAccount()
    {
        _accountNumber = ++_nextAccountNumber;
        _balance = 0.0;
    }

    public void Deposit(decimal amount) 
    {
        _balance += amount;
    }
    etc...

Этот сайт также полезен: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

То, что вы делаете, нормально, но не безопасно для потоков.thepirat000 упомянул в комментарии, что вы можете использовать оператор блокировки.

private static object acctNumLock = new object();
…
lock(acctnumLock) { 
    _accountNumber = ++_nextAccountNumber;
    }

Вам также следует рассмотреть возможность использования более эффективного метода Interlock.Increment .Оператор блокировки позволяет вам «блокировать» (разрешать доступ только один поток за раз) к блоку операторов.Interlock.Increment - это атомарная операция, которая выполняет только одну вещь (а именно увеличивает значение), но делает это таким образом, чтобы гарантировать, что операция завершена до переключения потока.Оба обеспечивают безопасность потоков.

Есть ли лучший способ?Это очень сложный вопрос, потому что это зависит от того, что вы пытаетесь сделать.Я подозреваю, что реальные банковские приложения снимают блокировки БД и используют специальные алгоритмы для генерации номеров счетов (т.е. гораздо более сложный процесс).Если вы просто пытаетесь генерировать уникальные значения для простых приложений, то у вас должно получиться нормально.

0 голосов
/ 18 февраля 2019

Здесь вы можете использовать Interlocked.Increment , который возвращает увеличенную сумму.Это должно быть поточно-ориентированным, в ссылке на документ есть пример, который использует его для этой цели.

using System.Threading;

... 

public void InitBankAccount()
{
    _accountNumber = Interlocked.Increment(ref _nextAccountNumber);
    _balance = 0.0;
}
...