C# 创建全局数字,增加 1
C# Creating global number which increase by 1
我正在编写简单的银行帐户教程程序。对于每个注册的新客户,帐号将增加 1,以获得新的 ID。
我在 "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
你实际上可以在这里使用Interlocked.Increment,returns增加的数量。它应该是线程安全的,文档中有一个示例 link 将它用于该目的。
using System.Threading;
...
public void InitBankAccount()
{
_accountNumber = Interlocked.Increment(ref _nextAccountNumber);
_balance = 0.0;
}
你做的没问题,但不是线程安全的。 thepirat000 在评论中提到您可以使用锁定语句。
private static object acctNumLock = new object();
…
lock(acctnumLock) {
_accountNumber = ++_nextAccountNumber;
}
您还应该考虑使用效率更高的Interlock.Increment方法。 lock 语句允许您 'lock' (一次只允许一个线程访问)一个语句块。 Interlock.Increment 是一个原子操作,它只做一件事(即增加一个值),但这样做的方式确保操作在线程切换之前完成。两者都提供线程安全。
有没有更好的方法?这是一个很难回答的问题,因为这取决于你想做什么。我怀疑实际的银行应用程序会取出数据库锁并使用特定算法来生成帐号(即更复杂的过程)。如果您只是想为简单的应用程序生成唯一值,那么您所拥有的应该可以正常工作。
我正在编写简单的银行帐户教程程序。对于每个注册的新客户,帐号将增加 1,以获得新的 ID。 我在 "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
你实际上可以在这里使用Interlocked.Increment,returns增加的数量。它应该是线程安全的,文档中有一个示例 link 将它用于该目的。
using System.Threading;
...
public void InitBankAccount()
{
_accountNumber = Interlocked.Increment(ref _nextAccountNumber);
_balance = 0.0;
}
你做的没问题,但不是线程安全的。 thepirat000 在评论中提到您可以使用锁定语句。
private static object acctNumLock = new object();
…
lock(acctnumLock) {
_accountNumber = ++_nextAccountNumber;
}
您还应该考虑使用效率更高的Interlock.Increment方法。 lock 语句允许您 'lock' (一次只允许一个线程访问)一个语句块。 Interlock.Increment 是一个原子操作,它只做一件事(即增加一个值),但这样做的方式确保操作在线程切换之前完成。两者都提供线程安全。
有没有更好的方法?这是一个很难回答的问题,因为这取决于你想做什么。我怀疑实际的银行应用程序会取出数据库锁并使用特定算法来生成帐号(即更复杂的过程)。如果您只是想为简单的应用程序生成唯一值,那么您所拥有的应该可以正常工作。