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