前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go-标准库-sync(一)

Go-标准库-sync(一)

原创
作者头像
堕落飞鸟
发布2023-04-21 21:01:53
1750
发布2023-04-21 21:01:53
举报
文章被收录于专栏:飞鸟的专栏飞鸟的专栏

sync 是 Go 语言标准库中提供的用于同步、并发控制的包,其中包含了一些常用的同步工具,例如:互斥锁(Mutex)、读写锁(RWMutex)、条件变量(Cond)等。

互斥锁(Mutex)

互斥锁(Mutex)是 sync 包中最常用的同步机制,可以用来保护临界区,避免多个 goroutine 同时访问造成的竞争条件(Race Condition)。互斥锁有两个状态:锁定(Locked)和未锁定(Unlocked)。一旦锁定,其它 goroutine 将无法获取锁,只有当锁被释放后,其它 goroutine 才能获取锁并进入临界区。

互斥锁提供了两个主要的方法:Lock()Unlock()Lock() 方法会将互斥锁置为锁定状态,如果互斥锁已经被锁定,则会阻塞当前 goroutine 直到锁被释放。Unlock() 方法用于释放锁,如果互斥锁当前未被锁定,则会引发 panic。

下面是一个互斥锁的示例代码:

代码语言:javascript
复制
package main

import (
	"fmt"
	"sync"
)

var count int
var mutex sync.Mutex

func increment() {
	mutex.Lock()
	defer mutex.Unlock()
	count++
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}
	wg.Wait()
	fmt.Println(count)
}

在上面的示例代码中,我们定义了一个 count 变量和一个互斥锁 mutexincrement() 函数用于对 count 进行加一操作,并且在操作完成后立即释放互斥锁,避免锁被一直占用而导致其它 goroutine 无法进入临界区。在 main() 函数中,我们启动了 1000 个 goroutine 并发地执行 increment() 函数,最终输出 count 的值。由于互斥锁的保护,程序的输出结果总是 1000。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 互斥锁(Mutex)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档