go 使用 - sync.Metux

@[TOC](sync.metux 使用)

简介

复制代码
简述使用metux使用的方法, 使用的注意点, 以及使用情况

使用方法

提供的方法

Lock() 方法用于获取锁

Unlock() 方法用于释放锁

TryLock()方法尝试获取锁

对共享资源进行加锁, 例 :

go 复制代码
func increment() {
	// 加锁
	mutex.Lock()
	// 解锁
	defer mutex.Unlock()
	// 访问共享资源
	counter++
	fmt.Printf("Incremented: %d\n", counter)
	// 模拟一些工作
	time.Sleep(time.Millisecond * 100)
}

func main() {
	var wg sync.WaitGroup

	// 启动多个 goroutine 来模拟并发访问
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}
	// 等待所有 goroutine 完成
	wg.Wait()
	fmt.Println("Final Counter:", counter)
}
复制代码
Incremented: 1
Incremented: 2
Incremented: 3
Incremented: 4
Incremented: 5
Final Counter: 5

使用注意点

1、锁不可复制 , 例如需要用func 传递 metux 。 源码中锁结构中主要是一个state(记录锁的状态), 本来锁只有一把, 一个协程拿到一个锁, 如果复制了 那 俩把锁共享一个内存状态, 那就出错了。

go 复制代码
// 错误使用
func deal(m sync.Mutex) {
    ...
}

// 正确做法
func deal(m *sync.Mutex) {
    ...
}

2、 缩短、小锁使用的范围

go 复制代码
// 不建议 
mutex.Lock()
// 其他逻辑处理
counter++
// 其他逻辑处理
mutex.Unlock()

// 建议 
mutex.Lock()
	counter++
mutex.Unlock()

当然不能一概而论

go 复制代码
// 如果循环体内对共享资源的访问非常简单,而且锁的粒度很小,可能在循环内加锁更为合适。这样可以更细粒度地控制对共享资源的访问,减小锁的持有时间
for i := 0; i < 10; i++ {
    mutex.Lock()
    // 对共享资源的简单访问
    mutex.Unlock()
}
//  如果循环体内有复杂的逻辑,而且锁的粒度比较大,可能需要在循环外加锁,以避免在每次迭代时频繁地获取和释放锁,从而降低性能
mutex.Lock()
defer mutex.Unlock()
for i := 0; i < 10; i++ {
    // 复杂逻辑,可能涉及多个步骤
}

3、避免锁嵌套 可能会造成死锁的情况

例子是 《Concurrency in GO》-- 死锁一章

4、考虑使用读写锁, 在读多写少的情况下

5、如果想要锁用来通讯, 建议使用channel。 锁主要是保护共享资源的访问的。

使用场景

1、共享资源的访问

2、确保某个操作是原子的

这张图 也是 《Concurrency in GO》-并发哲学, 建议我们什么时候使用锁, 什么时候使用channel

源码解读

相关推荐
代码游侠12 小时前
学习笔记——数据结构学习
linux·开发语言·数据结构·笔记·学习
w***765512 小时前
[golang][MAC]Go环境搭建+VsCode配置
vscode·macos·golang
沐知全栈开发12 小时前
XML 验证器
开发语言
自学互联网12 小时前
使用Python构建钢铁行业生产监控系统:从理论到实践
开发语言·python
合作小小程序员小小店12 小时前
桌面开发,在线%医院管理%系统,基于vs2022,c#,winform,sql server数据
开发语言·数据库·sql·microsoft·c#
一点★13 小时前
“equals”与“==”、“hashCode”的区别和使用场景
java·开发语言
十一.36613 小时前
79-82 call和apply,arguments,Date对象,Math
开发语言·前端·javascript
合作小小程序员小小店13 小时前
桌面开发,下午茶甜品管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·c#
葡萄成熟时 !13 小时前
黑马学生管理系统
java·开发语言
秋邱13 小时前
高等教育 AI 智能体的 “导学诊践” 闭环
开发语言·网络·数据库·人工智能·python·docker