2012-04-16 31 views
2

http://i.stack.imgur.com/D01ja.pngJava银行账户同步示例。未能看到解决方案如何工作

所以,我正在阅读关于显示上述示例问题的同步的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; 
    } 

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

回答

1

使用synchronized关键字的要点是,一次只有一个线程可以访问该方法,并且图像上的架构变得不可能。

但是,正如下面所讨论的那样,setBalance方法的存在使得滥用类并获得不希望的输出成为可能。

+0

线程获得锁定,获取平衡。线程二获取锁,抓住平衡。 – user1015682 2012-04-16 22:27:36

+0

我还是不明白。如果在调用getBalance()和setBalance()之间放弃锁定,则在该间隔期间仍然会发生任何事情。 – user1015682 2012-04-16 22:37:08

+0

您应该使用存款方式。如果你使用getBalance,做你的数学,然后使用setBalance,它显然会失败的同步目的是确保存款是一个原子动作。 – assylias 2012-04-16 22:37:45

3

synchronized关键字确保两个线程不能同时进入同一个对象的同步块。

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

因此,尽管如此balance += amt;不是原子的 - 它是同步的,因此在这个语句的评估过程中状态不可能发生变化。

0

如果PDF提议作为最终解决方案,因为它完全无法解决显示您的图像的问题,我会感到惊讶! 也许它向你展示了一个天真的尝试来解决这个问题,在同一个关键字周围喷涂一点点?

我会继续阅读你的PDF - 并发布你的发现!

+0

这确实有道理! – assylias 2012-04-16 22:42:20

+0

是的,看到了你的其他评论,而不是最好的例子,如果这就是全部! – davidfrancis 2012-04-16 22:43:40

+0

该类是线程安全的。 •如果我们有一个对象acc Account,线程t1和t2。 当t1调用acc.deposit(500); t2不能启动 执行acc.deposit(1000),直到t1完成 方法。 •同步方法setBalance()和getBalance()也是 ,因为在读取期间余额可能会更改,如果未同步,则写入 。 – user1015682 2012-04-16 22:55:17