Sobes.tech
Senior
50

Kokios problemos gali iškilti race condition požiūriu atnaujinant naudotojo balansą ir kokie yra sprendimai Go kalboje?

Įmonės kur klausė
Prediva

Atsakymas iš AI

sobes.tech AI

При обновлении баланса пользователя в конкурентной среде может возникнуть race condition, когда несколько горутин одновременно читают и записывают значение баланса, что приводит к некорректным результатам (например, потеря обновлений).

Проблемы:

  • Несогласованное состояние баланса из-за одновременных записей.
  • Потеря данных при одновременном инкременте или декременте.

Способы решения в Go:

  1. Мьютексы (sync.Mutex) Использовать мьютекс для защиты критической секции, где происходит чтение и запись баланса.
var mu sync.Mutex
var balance int

func updateBalance(amount int) {
    mu.Lock()
    defer mu.Unlock()
    balance += amount
}
  1. Атомарные операции (sync/atomic) Для простых числовых типов можно использовать атомарные функции, например atomic.AddInt64.
import "sync/atomic"

var balance int64

func updateBalance(amount int64) {
    atomic.AddInt64(&balance, amount)
}
  1. Каналы Организовать последовательный доступ к балансу через канал, передавая операции на обновление в отдельную горутину.
type operation struct {
    amount int
    done   chan bool
}

var ops = make(chan operation)

func balanceManager() {
    var balance int
    for op := range ops {
        balance += op.amount
        op.done <- true
    }
}

func updateBalance(amount int) {
    done := make(chan bool)
    ops <- operation{amount, done}
    <-done
}

func main() {
    go balanceManager()
    updateBalance(100)
}

Выбор метода зависит от сложности задачи и требований к производительности.