网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Go中的同步原语主要有以下几种:
- 互斥锁 (Mutex):互斥锁用于保护共享资源,确保同一时刻只有一个goroutine可以访问该资源。互斥锁有两种状态:加锁和解锁。加锁表示某个goroutine正在访问共享资源,其他goroutine必须等待该goroutine解锁后才能访问该资源。
- 读写锁 (RWMutex):读写锁是一种特殊的互斥锁,它允许多个goroutine同时读共享资源,但只有一个goroutine可以写共享资源。读写锁可以提高并发读性能,同时保证写操作的原子性。
- 条件变量 (Cond):条件变量用于在互斥锁的保护下等待某个条件满足。goroutine可以使用条件变量的Wait方法等待条件满足,并使用Signal或Broadcast方法唤醒其他正在等待的goroutine。
- 信号量 (Semaphore):信号量用于控制对共享资源的访问权限。信号量有一个计数器,表示可用的资源数量。goroutine可以使用信号量的Acquire方法获取资源,并使用Release方法释放资源。
- WaitGroup:WaitGroup用于等待一组goroutine完成。WaitGroup有一个计数器,表示未完成的goroutine数量。goroutine可以使用WaitGroup的Add方法增加计数器,并使用Done方法减少计数器。当计数器为零时,表示所有goroutine都已完成。
同步原语的使用示例:
// 使用互斥锁保护共享资源
var m sync.Mutex
var count int
func increment() {
m.Lock()
count++
m.Unlock()
}
func decrement() {
m.Lock()
count--
m.Unlock()
}
// 使用条件变量等待条件满足
var c sync.Cond
var flag bool
func wait() {
c.L.Lock()
for !flag {
c.Wait()
}
c.L.Unlock()
}
func signal() {
c.L.Lock()
flag = true
c.Signal()
c.L.Unlock()
}
// 使用信号量控制对共享资源的访问权限
var s sync.Semaphore
func acquire() {
s.Acquire()
// 使用共享资源
s.Release()
}
// 使用WaitGroup等待一组goroutine完成
var wg sync.WaitGroup
func worker() {
// 执行任务
wg.Done()
}
func main() {
wg.Add(10)
for i := 0; i < 10; i++ {
go worker()
}
wg.Wait()
}
![img](https://img-blog.csdnimg.cn/img_convert/3f6dc7990bed8d27b37d8f782eefa468.png)
![img](https://img-blog.csdnimg.cn/img_convert/b4beb9d83ddbc44b1484e0be70e10c17.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**