网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**