【发布时间】:2013-06-08 06:23:41
【问题描述】:
我有一个方法可以接收两个银行账户作为输入并交换它们的值:
Public void TransferAccount(AccountID id1, AccountID id2){
Account a1 = id1.GetAccount();
Account a2 = id2.GetAccount();
//Swap amounts.
Temp = a1.Balance;
a1.Balance = a2.Balance;
a2.Balance = Temp;
}
我想让这个方法以尽可能高的性能成为线程安全的(我猜这意味着我们可能不会使方法同步),我们还必须小心死锁,
我想到了以下解决方案:
Public void TransferAccount(AccountID id1, AccountID id2){
Account a1 = id1.GetAccount();
Account a2 = id2.GetAccount();
//Swap amounts.
synchronized(a1){
wait(a2);
synchronized(a2){
Temp = a1.Balance;
a1.Balance = a2.Balance;
a2.Balance = Temp;
}
}
}
在性能方面有没有更好的实现?顺便说一句,这是线程安全的吗?
【问题讨论】:
-
我猜这意味着我们可能不会使方法同步 ...我猜这意味着这是家庭作业?
-
@BrianRoach:我不明白是什么让你这么想。 OP 说“我需要尽可能高的性能,我想这意味着我不能只制作方法
synchronized”。这对我来说并不叫“功课”,尽管它确实叫“缺乏特定的性能要求”。 -
"这种方法是线程安全的,具有尽可能高的性能" 如果你这样做了,一个线程将比使用多个线程快得多。即快 10 倍以上。 vanillajava.blogspot.co.uk/2011/11/… 见
Accounting example。 -
即使是这样,为什么作业这么讨厌SO?我一直不明白这一点。我曾经对我的家庭作业感到困惑。
标签: java multithreading thread-safety