ATM如何在并发环境中工作

时间:2012-09-02 14:50:36

标签: java multithreading concurrency

一个简单的例子:

      class Account{
           private String account_name;
           private String password;
           private double balance;

           public synchronized double getBalance(){
                  return balance;
           }
           public synchronized void setBalance(double add){
                  balance += add;
           }
      }

根据我的理解,获取与对象关联的锁不会阻止其他线程访问该对象。它们必须是相同的锁才能阻止访问。

因此,如果两个人尝试在不同的ATM上访问同一个帐户,那么它将创建此Account个对象的两个不同实例,对吗?所以它没有用同样的锁保护,对吗?

假设人A(线程A)试图将钱存入账户,同时人B(线程B)试图获得账户的总余额。

它是如何工作的?他们是否在使用时缓存Account,以便在下一个请求进入时返回相同的Account对象?

4 个答案:

答案 0 :(得分:4)

同步方法将锁定对象实例。但是,如果存在一个未同步的方法,则可能发生并发访问。

ATM机无法访问您的帐户 - 银行服务器可以访问您的帐户。 ATM机只是一个客户端。因此,从两个不同的ATM访问同一个帐户将由银行服务器保护,该服务器的内存/数据库中只有一个该帐户的实例(可能受某些锁定机制保护,而不是用Java编写)。

答案 1 :(得分:0)

这取决于系统的实施方式。通常你有一个类的实例,每个实例都有一个与之关联的隐式锁,或者你可以创建一个简单的

  

私人对象锁;

然后每个人(无论是ATM还是银行员工或其他人)都必须明确获得此锁。在一天结束时,它归结了系统的设计和实现方式 - 锁定原语只是原型。设计人员/实施者可以利用并在每个组件中适当地使用它们 - 一致锁定。此外,在这种情况下,我会选择原子加倍并省去获取潜在重物锁的麻烦。

答案 2 :(得分:0)

我最好的猜测是他们正在使用像缓存一样的对象池,当请求到来时,它将使用一些唯一的标识符(如帐号)搜索池中存在的特定对象(Account)。如果存在,将返回引用。另外,它将从持久数据源加载到池中,并且将创建并返回新引用。因此,即使两个用户(线程)也尝试同时访问它。服务器不会为每个实例创建两个实例。

其次,如果一个类中有多个同步方法,并且如果一个线程当前正在一个synchronized方法内执行,那么试图访问同一个对象的任何同步方法的所有其他线程将被阻塞(暂停执行)直到第一个线程存在同步方法。

答案 3 :(得分:0)

  

根据我的理解,获取与对象关联的锁不会阻止其他线程访问该对象。它们必须是相同的锁才能阻止访问。

正确。如果多个线程尝试获取一个简单的锁,那么只允许继续执行。然而,锁不一定需要与单个对象相关联。您也可以为其他任务创建locks

  

因此,如果两个人尝试在不同的ATM上访问同一个帐户,那么它将创建此Account对象的两个不同实例,对吗?所以它没有用同样的锁保护,对吗?假设人A(线程A)试图将钱存入账户,同时人B(线程B)试图获得账户的总余额。它是如何工作的 ?他们在使用时是否缓存帐户,以便在下一个请求进入时返回相同的Account对象?

您要描述的是分布式锁定方案,这是完全不同的。正如有人已经提到的那样,ATM会将交易发回给银行进行处理,那里的服务器将处理并发问题。