gpt4 book ai didi

multithreading - 如何确保锁定顺序以避免死锁?

转载 作者:行者123 更新时间:2023-12-02 02:00:49 27 4
gpt4 key购买 nike

假设有以下 Account 类的两个对象 - account1 和 account2。并且有两个线程T1和T2。

T1 正在将金额 100 从 account1 转移到 account2,如下所示:

account1.transfer(account2, 100);

类似地,T2 正在将金额 50 从 account2 转移到 account1:
account2.transfer(account1, 50);

transfer() 方法显然容易发生死锁,因为两个线程 T1 和 T2 将尝试以相反的顺序获取锁。 (线程 T1 将首先尝试获取 account1 上的锁,然后再获取 account2 上的锁。而线程 T2 将尝试先获取 account2 上的锁,然后再获取 account1 上的锁。)

确保始终保证锁定顺序的最佳方法是什么(在这种情况下)?
public class Account {
private float balance;

public class Account() {
balance = 5000f;
}

private void credit(float amt) {
balance += amt;
}

// To exclude noise assume the balance will never be negative
private void debit(float amt) {
balance -= amt;
}

// Deadlock prone as the locking order is not guaranteed
public void transfer(Account acc2, float amt) {
synchronized(this) {
synchronized(acc2) {
acc2.debit(amt);
this.credit(amt);
}
}
}
}

最佳答案

我只会让一个线程访问“帐户”数据。任何其他想要转移资金的线程都必须向它排队一个“transferRequest”对象,其中包含帐户 ID、要转移的金额、异常/错误消息字段和回调/事件,以 transferRequest 作为参数,用于线程在尝试交易时调用。

然后传输被完整地序列化,唯一的锁在队列中,所以死锁是不可能的。

我讨厌多把锁,无论是否正确订购。

关于multithreading - 如何确保锁定顺序以避免死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17268485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com