看看这个同步的问题

happy_0201 2010-01-16 07:23:39

这个方法是 从一个账户转到 另一个账户。各位 看看同步 还有 异常处理等等是否有问题呢?谢谢
public void transferMoney(Account fromAccount, Account toAccount,
float money) throws NoMoneyExcepiton {

synchronized (fromAccount) {

synchronized (toAccount) {
if (fromAccount.getMoney.compareTo(money)) {
throw new NoMoneyExcepiton();
} else {
fromAccount.reduce(money);

toAccount.add(money);

}

}

}

}
...全文
175 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
amdgaming 2010-01-18
  • 打赏
  • 举报
回复
up 看其他高手 解答
kobeBryant_ 2010-01-17
  • 打赏
  • 举报
回复
有问题吗? 没发现
amdgaming 2010-01-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 whut_lcy 的回复:]
才看到你的两个synchronized的对象不是同一个。两个synchronized是有必要的。
不过为何不用数据库事物来进行转账呢?把这个过程用数据库事物来完成会更好
[/Quote]
是的, 就是 发生异常的需要 处理,然后 需要 调用 notifyall方法 吧,我认为
ciltr 2010-01-17
  • 打赏
  • 举报
回复
当两个账户同时给对方转账时,如果同时进入外层同步块,就会发生死锁.
whut_lcy 2010-01-17
  • 打赏
  • 举报
回复
才看到你的两个synchronized的对象不是同一个。两个synchronized是有必要的。
不过为何不用数据库事物来进行转账呢?把这个过程用数据库事物来完成会更好
whut_lcy 2010-01-17
  • 打赏
  • 举报
回复
1)搞这么多synchronized干啥?就外围的一个synchronized就够了,你把对象锁一次就可以了,别人已经拿不到了,你又锁一次。这又不是实际生活的双保险。多余,拿掉

2)建议把抛新异常的代码用try catch-finally包围起来,然后在finally这里优雅的用notify释放锁。
记住notify也是要用try-catch包起来
huangwj20042008 2010-01-17
  • 打赏
  • 举报
回复
当别的地方像下面这样写代码的时候,个人觉得会出问题,应该会死锁。


synchronized (toAccount ) {

synchronized (fromAccount) {
...

}

}

}

深夜情感老师 2010-01-16
  • 打赏
  • 举报
回复
呵呵路过看看
amdgaming 2010-01-16
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
没有看明白
happy_0201 2010-01-16
  • 打赏
  • 举报
回复
up啊啊


yuhongpingimu 2010-01-16
  • 打赏
  • 举报
回复
呀呀,不会。ding
happy_0201 2010-01-16
  • 打赏
  • 举报
回复
自己 up

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧