C#创造全球数量增加1

C#创造全球数量增加1,c#,.net-core,asp.net-core-2.0,C#,.net Core,Asp.net Core 2.0,我正在编写简单的银行账户教程程序。对于每个注册的新客户,新id的账号将增加1。 我在《C#Mueller》一书中看到了一个例子。我只是好奇,如果这是一种正确的方法,它将如何处理并发注册?是否有更好的方法来处理这个问题,可能是使用单例或全局变量,内存缓存?在实际应用程序中如何处理类似的项目 public class BankAccount { private static int _nextAccountNumber = 1000; private int _accountNumb

我正在编写简单的银行账户教程程序。对于每个注册的新客户,新id的账号将增加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...
此站点也很有用:

您可以在此处实际使用,它返回递增的金额。它应该是线程安全的,在docs链接中有一个例子使用它

using System.Threading;

... 

public void InitBankAccount()
{
    _accountNumber = Interlocked.Increment(ref _nextAccountNumber);
    _balance = 0.0;
}
实际上,您可以在此处使用,它返回递增的金额。它应该是线程安全的,在docs链接中有一个例子使用它

using System.Threading;

... 

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

您正在做的是可以的,但不是线程安全的。Pirat000在评论中提到可以使用lock语句

private static object acctNumLock = new object();
…
lock(acctnumLock) { 
    _accountNumber = ++_nextAccountNumber;
    }
你也应该考虑使用更有效的方法。lock语句允许您对语句块进行“锁定”(一次只允许一个线程访问)。Increment是一个原子操作,它只做一件事(即增加一个值),但这样做的方式确保操作在线程切换之前完成。两者都提供线程安全性


有更好的办法吗?这是一个很难回答的问题,因为这取决于你想做什么。我怀疑实际的银行应用程序需要DB锁,并使用特定的算法来生成账号(也就是说,这是一个复杂得多的过程)。如果您只是试图为简单的应用程序生成唯一的值,那么您所拥有的应该可以正常工作

您正在做的是可以的,但不是线程安全的。Pirat000在评论中提到可以使用lock语句

private static object acctNumLock = new object();
…
lock(acctnumLock) { 
    _accountNumber = ++_nextAccountNumber;
    }
你也应该考虑使用更有效的方法。lock语句允许您对语句块进行“锁定”(一次只允许一个线程访问)。Increment是一个原子操作,它只做一件事(即增加一个值),但这样做的方式确保操作在线程切换之前完成。两者都提供线程安全性


有更好的办法吗?这是一个很难回答的问题,因为这取决于你想做什么。我怀疑实际的银行应用程序需要DB锁,并使用特定的算法来生成账号(也就是说,这是一个复杂得多的过程)。如果您只是试图为简单的应用程序生成唯一的值,那么您所拥有的应该可以正常工作

您可以轻松地测试它并证明您的代码不可靠。i、 e.:
Parallel.ForEach(Enumerable.Range(11000),i=>{newbankaccount().InitBankAccount();});Assert.AreEqual(2000年,银行账户编号)。在这之后,您可以使用增量操作上的来获取互斥。当您重新启动应用程序时,计数将重新启动。现实生活中的应用程序将生成的数字存储在数据库中,您可以轻松地对其进行测试,并证明您的代码不可靠。i、 e.:
Parallel.ForEach(Enumerable.Range(11000),i=>{newbankaccount().InitBankAccount();});Assert.AreEqual(2000年,银行账户编号)。在这之后,您可以使用增量操作上的来获取互斥。当您重新启动应用程序时,计数将重新启动。现实生活中的应用程序将生成的数字存储在数据库中