MST

星途 面试题库

面试题:Go语言中Go并发范式在电商库存扣减业务的适配

假设在电商业务场景下,有多个用户同时对某一商品进行购买操作,需要扣减库存。请使用Go语言的并发范式来实现一个简单的库存扣减逻辑,说明如何处理并发冲突以及保证库存数据的一致性。
37.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

// 定义库存结构体
type Stock struct {
    quantity int
    mutex    sync.Mutex
}

// 扣减库存方法
func (s *Stock) deduct(amount int) bool {
    s.mutex.Lock()
    defer s.mutex.Unlock()

    if s.quantity >= amount {
        s.quantity -= amount
        return true
    }
    return false
}

func main() {
    // 初始化库存
    stock := Stock{quantity: 100}

    var wg sync.WaitGroup
    numUsers := 10
    purchaseAmount := 10

    for i := 0; i < numUsers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            success := stock.deduct(purchaseAmount)
            if success {
                fmt.Println("购买成功")
            } else {
                fmt.Println("库存不足,购买失败")
            }
        }()
    }

    wg.Wait()
}
  1. 并发冲突处理
    • 使用sync.Mutex来保护库存数据的访问。在扣减库存的deduct方法中,通过s.mutex.Lock()s.mutex.Unlock()(使用defer确保解锁一定会执行)来保证同一时间只有一个goroutine可以操作库存数据,从而避免并发冲突。
  2. 保证库存数据一致性
    • 由于使用了互斥锁,对库存数据的读和写操作都是原子性的,不会出现数据竞争导致的不一致情况。在每次扣减库存前,先检查库存是否足够,只有在库存足够时才进行扣减操作,确保库存数据在并发操作下的一致性。