2024年最新「有问必答」秒杀系统 Go并发编程实践!(1),大牛手把手教你

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

} else {
    fmt.Printf("用户%d未获取到锁,秒杀失败\n", user)
}

}


#### 3.3 并发控制和等待


为了控制并发请求的数量,我们使用计数器和通道来限制并发度。



var wg sync.WaitGroup

func main() {
for i := 1; i <= 1000; i++ {
wg.Add(1)
go handleRequest(i)
}
wg.Wait()
}


#### 3.4 互斥锁和并发安全


为了保证并发访问的安全性,我们使用互斥锁来保护共享资源的访问。


**注意:TryLock()是go1.18才引入的**



func tryAcquireLock() bool {
return mu.TryLock()
}

func releaseLock() {
mu.Unlock()
}


### 4. 完整代码



package main

import (
“fmt”
“sync”
)

//后面开启了1000个goroutine,所以这里channel的缓冲区设置成了1000
var ch = make(chan bool, 1000)

type Product struct {
sync.Mutex
stock int64 // 商品库存
}

func main() {
p := Product{stock: 1000}
for i := 1; i <= 1000; i++ {
go p.handleRequest(i)
}
<-ch
}

func (p *Product) handleRequest(user int) {
if p.tryAcquireLock() {
if p.stock > 0 {
// 执行秒杀逻辑
p.stock–
fmt.Printf(“用户%d秒杀成功,剩余库存:%d\n”, user, p.stock)
} else {
fmt.Printf(“用户%d秒杀失败,库存不足\n”, user)
}
//这里是不可以使用defer的,因为可能会加锁失败,unlock一个不存在的锁
p.releaseLock()
} else {
fmt.Printf(“用户%d未获取到锁,秒杀失败\n”, user)
}
}

func (p *Product) tryAcquireLock() bool {
//p.TryLock() 方法用于尝试获取锁,如果成功获取到锁,则相当于执行了 Lock() 操作,即加锁成功。
return p.TryLock()
}

func (p *Product) releaseLock() {
p.Unlock()
ch <- true
}


#### 解析代码


`var ch = make(chan bool, 1000)`:后面开启了1000个goroutine,所以这里channel的缓冲区设置成了1000


`p.releaseLock()`:这里是不可以使用defer的,因为可能会加锁失败,unlock一个不存在的锁


`p.TryLock()`:方法用于尝试获取锁,如果成功获取到锁,则相当于执行了 Lock() 操作,即加锁成功。


### 5. 运行结果


![](https://img-blog.csdnimg.cn/img_convert/53fe36e71d4bd36ad5bda9aaf2a4ed01.png)


### 6. 总结


通过使用Go语言的并发原语,我们成功地构建了一个高并发的秒杀系统。


**使用互斥锁和计数器等原语,我们实现了并发控制、数据一致性和并发安全。这些原语帮助我们解决了高并发场景下的并发访问问题,并保证了系统的稳定性和性能。**


本文只是一个简单的示例,实际的秒杀系统可能涉及更多的业务逻辑和并发控制。


在实际应用中,还需要考虑数据库事务、分布式锁、限流等问题。因此,建议根据实际需求和场景进行更详细的设计和实现。


我之前也有写万字长文总结过,感兴趣的朋友欢迎查看:[万字详解:秒杀系统设计]( )


### 一起学习




![img](https://img-blog.csdnimg.cn/img_convert/5e8dcd3c6c83c6de696e7c013ca7ab3d.png)
![img](https://img-blog.csdnimg.cn/img_convert/24ec2ab60db1ff97c05d9940bd7e71aa.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值