Как получить блокировку нескольких предметов?
Рассмотрим пример ниже:
Map<String, Account> accountMap = new HashMap<>(); // key=accountNumber,value=AccountObject
class Account{
private String accountNumber; // getter & setter
private double accountBalance; // getter & setter
}
Мне нужно перевести средства с одного счета на другой, поэтому я подумывал о вложил синхронизированный блок и понял, что это приведет к взаимоблокировке.
// bad code
synchronized(accountMap.get(accountNumber1)){
synchronized(accountMap.get(accountNumber2)){
// business logic
}
}
Кроме того, я не хочу одиночную блокировку, потому что она заблокирует обработку всех потоков для одной транзакции. Примерно так:
//bad code
Object mutex = new Object();
synchronized(mutex){
// business logic with accountNumber1 & accountNumber2
}
Как мне go решить эту проблему? Мне нужно поддерживать блокировки только для двух объектов аккаунта.
Также возможен дубликат (но я хотел знать, есть ли другие решения). Предотвращение тупиковой ситуации в фиктивной банковской базе данных