首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >银行转账同步

银行转账同步
EN

Stack Overflow用户
提问于 2013-08-28 20:08:11
回答 1查看 1.5K关注 0票数 1

我在今天的面试中问到了这个问题。

代码语言:javascript
复制
class BankAccount {
    private int money;

    public synchronized void deposite(int sum) {
        money += sum;
    }

    public synchronized void withdraw(int sum) {
        money -= sum;
    }

    public synchronized int getMoney() {
        return money;
    }
}

class accountManager {
    public void transfer(BankAccount a, BankAccount b, int money) {      
    }
}

所以我需要写transfer()方法,所以它将是线程安全的,帐户余额应该是>= 0。

代码语言:javascript
复制
public void transfer(BankAccount a, BankAccount b, int money) {
    synchronized ( a ) {
        synchronized ( b ) {
            int temp = a.getMoney() - money;
            if (temp >= 0) {
                a.withdraw(temp);
                b.add(temp);
            }
        }
    }
}

我写了这段代码,但是当我们同时从a转移到b和从b转移到a时,它会产生死锁。所以第二个问题是,如何修复死锁?

EN

回答 1

Stack Overflow用户

发布于 2013-08-28 20:13:31

您必须以相同的顺序锁定对象,否则将出现死锁。

顺便说一句:鉴于锁的开销比所执行的操作要高得多,您最好使用全局锁或只使用一个线程。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18487464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档