я столкнулся с таким утверждением:условия гонки в чистом функциональном программировании
«Программирование в функциональном стиле делает государство представлено в код явного, что делает его гораздо легче рассуждать о, и, в совершенно чистой система, делает условия гонки нитей невозможными ».
Я вижу эту точку зрения, но как я могу достичь этого в реальных проблемах?
Например:
Существует функциональная программа с двумя функциями:
def getMoney(actMoney: Integer, moneyToGet: Integer): Integer
= actMoney - moneyToGet
def putMoney(actMoney: Integer, moneyToPut: Integer): Integer
= actMoney + moneyToPut
Тогда, я действительно хотел бы определить функции getActualMoney и saveActualMoney для данного счета, но я не могу, они не чисты. Это потому, что я получаю деньги за данную учетную запись из некоторой памяти, и я сэкономлю деньги для данной учетной записи в какой-то памяти (есть состояние).
def getActualMoney(accountNo: String): Integer = {...}
def saveActualMoney(accountNo: String, actMoney: Integer): Unit = {...}
Поэтому я должен получить свои текущие деньги из «снаружи». И, допустим, моя программа работает таким образом. Теперь у меня есть два одновременных запроса: во-первых: получить немного денег, а второй - за ту же учетную запись. Конечно, я получу два разных результата. Так что есть состояние гонки.
Понимаю, что я должен совершить транзакцию на этом «внешнем» программном коде. Так что такой ситуации не должно было быть. Для лучшего параллелизма функции должны выглядеть так:
def getMoney(
acountNo: String,
actMoney: Integer,
moneyToGet: Integer): (String, Integer)
= (acountNo, actMoney - moneyToGet)
def putMoney(
acountNo: String,
actMoney: Integer,
moneyToPut: Integer): (String, Integer)
= (acountNo, actMoney + moneyToPut)
Это то, что происходит? Стоит ли это делать?