Java 银行帐户同步示例。无法看到解决方案如何工作

标签 java synchronization account bank

/image/D01ja.png

所以,我正在阅读有关同步的 pdf 文件,其中显示了上述示例问题。稍后,提出以下内容,大概是一个解决方案:

class Account
{
  private double balance;
  public Account(double initialDeposit) {
    balance = initialDeposit;
  }
  public synchronized double getBalance() {
    return balance;
  }
  public synchronized void setBalance(double newBalance) {
    balance = newBalance;
  }
  public synchronized void deposit (double amt) {
   //essentially still multiple steps when in bytecode!
   balance += amt;
  }

我不明白这是如何解决问题的。也许这不是本意,但似乎是暗示的。我正在寻找一些关于它是否有效的确认。 }

最佳答案

synchronized关键字确保两个线程不能同时进入同步块(synchronized block)[在同一对象上]。

在您的情况下,不能同时对同一对象调用这 3 个方法,因为每个方法在调用时都持有 this 锁。

因此,balance += amt; 不是原子的 - 它是同步的,因此在评估此语句期间状态不可能改变。

关于Java 银行帐户同步示例。无法看到解决方案如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182207/

相关文章:

java - 如何从 JSF 中的 ActionListener 呈现表单的部分内容

java - 要转换为 PrivateKey 对象的字节

java - 这是 Java 类的多个函数的线程化和同步的好方法吗?

java - Java/J2me中常用的时区格式

meteor - 为什么 Meteor.Accounts 会返回 "has no method ' onCreateUser'"?

android - "If This Then That"如何实现对第三方用户帐户的访问(所谓的 "Channels")?

active-directory - 在 Windows Server 2008 R2 中创建服务帐户

java - 使用 Eclipse 默认 Drools 示例 DroolsTest 找不到 main

linux - SVN-repo 不同步

java - 如何以给定的概率传播随机值?