C#创造全球数量增加1
我正在编写简单的银行账户教程程序。对于每个注册的新客户,新id的账号将增加1。 我在《C#Mueller》一书中看到了一个例子。我只是好奇,如果这是一种正确的方法,它将如何处理并发注册?是否有更好的方法来处理这个问题,可能是使用单例或全局变量,内存缓存?在实际应用程序中如何处理类似的项目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
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年,银行账户编号)代码>。在这之后,您可以使用增量操作上的来获取互斥。当您重新启动应用程序时,计数将重新启动。现实生活中的应用程序将生成的数字存储在数据库中