В целях обучения параллельности / многопоточности я разрабатываю небольшой API для перевода денег, который будет одновременно вызываться несколькими пользователями.Моя «база данных» - это ConcurrentHashMap<String, Double>
, пара ключей / значений которой представляет собой идентификатор учетной записи и ее текущий баланс.
Я знаю, что отдельные операции ConcurrentHashMap (get()
, put()
и т. Д.)Потоково-безопасный, но метод вывода / депозита будет иметь несколько вызовов методов, что в конечном итоге сделает его не поточно-ориентированным.
Моя проблема: как спроектировать мои методы вывода / депозита, чтобы они были потоко-безопасными?Сначала я думал о том, чтобы сделать их synchronized
, но это не имеет никакого смысла, так как я бы отбросил мелкозернистый встроенный механизм синхронизации ConcurrentHashMap
.
Это обамои методы снятия и депозита (не беспокойтесь о Double
для денег здесь, это не имеет значения в этом контексте):
private void deposit(ConcurrentHashMap<String, Double> myDatabase, String fromAccountId, String toAccountId, double amount) {
if(myDatabase.get(fromAccountId) < amount) {
throw new MonetaryOperationViolation("Insufficient funds to perform this operation");
}
//Add the amount to the receiver's account
myDatabase.replace(toAccountId, myDatabase.get(toAccountId), c.get(toAccountId) + amount); //key, oldValue, newValue
//Withdraw it from the sender's account
withdraw(myDatabase, fromAccountId, amount);
}
private void withdraw(ConcurrentHashMap<String, Double> myDatabase, String accountId, double amount) {
if(myDatabase.get(accountId) < amount) {
throw new MonetaryOperationViolation("Insufficient funds to perform this operation");
}
myDatabase.replace(accountId, myDatabase.get(accountId), myDatabase.get(accountId) - amount);
}
Я надеюсь, что я ясно дал понять относительно моей проблемы.Любая помощь будет по достоинству оценена.