一个简单的例子:
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
对象?
答案 0 :(得分:4)
同步方法将锁定对象实例。但是,如果存在一个未同步的方法,则可能发生并发访问。
ATM机无法访问您的帐户 - 银行服务器可以访问您的帐户。 ATM机只是一个客户端。因此,从两个不同的ATM访问同一个帐户将由银行服务器保护,该服务器的内存/数据库中只有一个该帐户的实例(可能受某些锁定机制保护,而不是用Java编写)。
答案 1 :(得分:0)
这取决于系统的实施方式。通常你有一个类的实例,每个实例都有一个与之关联的隐式锁,或者你可以创建一个简单的
私人对象锁;
然后每个人(无论是ATM还是银行员工或其他人)都必须明确获得此锁。在一天结束时,它归结了系统的设计和实现方式 - 锁定原语只是原型。设计人员/实施者可以利用并在每个组件中适当地使用它们 - 一致锁定。此外,在这种情况下,我会选择原子加倍并省去获取潜在重物锁的麻烦。
答案 2 :(得分:0)
我最好的猜测是他们正在使用像缓存一样的对象池,当请求到来时,它将使用一些唯一的标识符(如帐号)搜索池中存在的特定对象(Account)。如果存在,将返回引用。另外,它将从持久数据源加载到池中,并且将创建并返回新引用。因此,即使两个用户(线程)也尝试同时访问它。服务器不会为每个实例创建两个实例。
其次,如果一个类中有多个同步方法,并且如果一个线程当前正在一个synchronized方法内执行,那么试图访问同一个对象的任何同步方法的所有其他线程将被阻塞(暂停执行)直到第一个线程存在同步方法。
答案 3 :(得分:0)
根据我的理解,获取与对象关联的锁不会阻止其他线程访问该对象。它们必须是相同的锁才能阻止访问。
正确。如果多个线程尝试获取一个简单的锁,那么只允许继续执行。然而,锁不一定需要与单个对象相关联。您也可以为其他任务创建locks。
因此,如果两个人尝试在不同的ATM上访问同一个帐户,那么它将创建此Account对象的两个不同实例,对吗?所以它没有用同样的锁保护,对吗?假设人A(线程A)试图将钱存入账户,同时人B(线程B)试图获得账户的总余额。它是如何工作的 ?他们在使用时是否缓存帐户,以便在下一个请求进入时返回相同的Account对象?
您要描述的是分布式锁定方案,这是完全不同的。正如有人已经提到的那样,ATM会将交易发回给银行进行处理,那里的服务器将处理并发问题。