Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ATM如何在并发环境中工作_Java_Multithreading_Concurrency - Fatal编程技术网

Java ATM如何在并发环境中工作

Java ATM如何在并发环境中工作,java,multithreading,concurrency,Java,Multithreading,Concurrency,一个简单的例子: class Account{ private String account_name; private String password; private double balance; public synchronized double getBalance(){ return balance; }

一个简单的例子:

      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机上访问同一个帐户,那么它将创建此
帐户
对象的两个不同实例,对吗?所以它不是用同一把锁看守的,对吗

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


它是如何工作的?他们是否在使用时缓存
帐户
,以便在下次请求时返回相同的
帐户
对象?

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

私有对象锁


然后每个人(无论是自动取款机、银行职员还是其他人)都必须明确地获得这个锁。最后,它总结了系统是如何设计和实现的——锁定原语就是那个原语。由设计人员/实现人员来使用,并在每个组件中适当地使用它们-一致锁定。此外,在这种情况下,我会选择原子双精度,省去获取可能很重的对象锁的麻烦。

同步方法将锁定对象实例。但是,如果有一种方法,它是不同步的,那么并发访问就可能发生


自动取款机不能进入你的账户——银行服务器可以。ATM机只是一个客户机。因此,从两台不同的ATM机访问同一个账户将受到银行服务器的保护,银行服务器的内存/数据库中只有一个该账户的实例(可能受到某种锁定机制的保护,而不是用Java编写的).

我的最佳猜测是,他们正在使用一个对象池(如缓存),当任何请求出现时,它都会使用一些唯一标识符(如帐号)搜索池中存在的特定对象(帐户)。如果存在,将返回引用。另一方面,它将从持久数据源加载到池中,并创建和返回新的引用。因此,甚至有两个用户(线程)试图在同一时间访问它。服务器不会为每个实例创建两个实例

其次,如果一个类中有多个同步方法,并且如果一个线程当前正在同步方法中执行,则尝试访问同一对象的任何同步方法的所有其他线程都将被阻止(暂停执行),直到第一个线程存在同步方法为止

据我所知,获取与对象关联的锁并不阻止其他线程访问该对象。它们必须是相同的锁,以防止访问

对。如果多个线程试图获取一个简单锁,那么只允许on继续。锁不一定需要与单个对象关联。您还可以为其他任务创建

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


在某种程度上,您所描述的是一个分布式锁定场景,这是完全不同的。正如有人已经提到的,ATM会将交易发送回银行进行处理,那里的服务器会处理并发问题。

尽管我打赌这是一个学术练习,因此锁定很可能是他的服务器代码的责任。如果银行服务器有多个实例,在负载平衡器后面运行?您说的“锁不一定需要与单个对象关联”是什么意思?按照惯例,您可以将多个对象与一个锁关联。例如,您可以将一个操作与一个锁相关联,该操作可能会修改多个对象。您是说对其中一个状态变量设置锁,然后修改该锁块中的其他状态变量?或多或少。这是一项有风险的业务,因为您必须确保所有代码都遵循锁定约定。无论何时使用锁来管理并发代码,这都是正确的。有更高级别的设施,使用更安全。有关更多信息,请查看Clojure或Erlang中的并发机制。