Go-标准库-sync(一)
2023-06-13 09:18:47 时间
sync
是 Go 语言标准库中提供的用于同步、并发控制的包,其中包含了一些常用的同步工具,例如:互斥锁(Mutex)、读写锁(RWMutex)、条件变量(Cond)等。
互斥锁(Mutex)
互斥锁(Mutex)是 sync
包中最常用的同步机制,可以用来保护临界区,避免多个 goroutine 同时访问造成的竞争条件(Race Condition)。互斥锁有两个状态:锁定(Locked)和未锁定(Unlocked)。一旦锁定,其它 goroutine 将无法获取锁,只有当锁被释放后,其它 goroutine 才能获取锁并进入临界区。
互斥锁提供了两个主要的方法:Lock()
和 Unlock()
。Lock()
方法会将互斥锁置为锁定状态,如果互斥锁已经被锁定,则会阻塞当前 goroutine 直到锁被释放。Unlock()
方法用于释放锁,如果互斥锁当前未被锁定,则会引发 panic。
下面是一个互斥锁的示例代码:
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
变量和一个互斥锁 mutex
。increment()
函数用于对 count
进行加一操作,并且在操作完成后立即释放互斥锁,避免锁被一直占用而导致其它 goroutine 无法进入临界区。在 main()
函数中,我们启动了 1000 个 goroutine 并发地执行 increment()
函数,最终输出 count
的值。由于互斥锁的保护,程序的输出结果总是 1000。
相关文章
- 安得倚天抽宝剑——Go中new到底在堆还是栈中分配
- Go Channel(收藏以备面试)
- 数据库Go-gorm实战
- 【Go】Chan 的使用和源码解析
- Go 数据结构和算法篇(三):队列
- JetBrains GoLand 2022 Mac(Go集成开发工具)中文版
- 「Go工具箱」将文件大小转换成Kb、Mb、Gb就用这个库:go-humanize
- 开心档之Go 语言环境安装
- Go-标准库-log(二)
- Go-标准库-math
- Go-标准库-text(二)
- Go-包管理-go install
- Go语言使用定时器实现任务队列
- Go语言封装qsort快速排序函数
- 语言操作Go语言操作MySQL开发高效应用(mysqlgo)
- 从零开始学习 Go 语言的切片
- Go语言环境配置:在 Linux 下实现(go环境搭建linux)
- 如何在Linux上安装Go语言?——简单易懂的指南(linux安装go语言)
- MySQL中使用Go语言的好处(mysql中go什么)
- 快跟上趋势,GO DB ORACLE(go db oracle)
- Redis集群搭建Go的艰难之路(redis集群搭建go)
- 语句使用Oracle中的Go语句来简化编程(oracle中go)
- Oracle Go用法快速指南(oracle go用法)
- Go项目的目录结构详解