go 语言中的锁机制和同步技术对于实现并发性至关重要。常用的锁机制包括:sync.mutex:互斥锁,一次只允许一个 goroutine 访问临界区。sync.rwmutex:读写锁,允许多个 goroutine 同时读,但一次只能有一个 goroutine 写。sync.cond:条件变量,用于等待或通知其他 goroutine。 内容来自samhan666
copyright zvvq
Go 语言中的锁机制与同步技术
内容来自zvvq
在 Go 语言中,锁和同步原语对于实现并发性和防止竞争至关重要。本文将探索 Go 语言提供的不同锁机制和同步技术,并提供实际示例说明其用法。 内容来自zvvq
锁机制
内容来自samhan
Go 语言中常用的锁机制有: 内容来自zvvq
sync.Mutex: 互斥锁,一次只允许一个 goroutine 访问临界区。 sync.RWMutex: 读写锁,允许多个 goroutine 同时读,但一次只能有一个 goroutine 写。 sync.Cond: 条件变量,用于等待或通知其他 goroutine。实战示例 zvvq
使用 sync.Mutex 保护临界区
内容来自samhan666
1
2 zvvq
3 zvvq好,好zvvq
4 内容来自zvvq,别采集哟
5
zvvq.cn
6
7
zvvq
8 zvvq.cn
9 内容来自samhan666
10
11 zvvq好,好zvvq
12 zvvq.cn
13 zvvq
14 本文来自zvvq
15 zvvq.cn
16
zvvq.cn
17 内容来自zvvq,别采集哟
18 内容来自zvvq,别采集哟
19
zvvq
20 zvvq好,好zvvq
21 zvvq.cn
22 内容来自zvvq
23
package main 内容来自zvvq,别采集哟
import (
"fmt"
"sync" zvvq
)
本文来自zvvq
var m sync.Mutex
var count int 本文来自zvvq
func increment() { zvvq.cn
m.Lock() zvvq好,好zvvq
defer m.Unlock()
count++
}
内容来自samhan666
func main() { copyright zvvq
go increment() 内容来自zvvq,别采集哟
go increment() 内容来自samhan
go increment() 内容来自zvvq
fmt.Println(count) // 输出:3 内容来自samhan666
} 内容来自zvvq
在示例中,我们使用互斥锁 m 保护临界区,确保每次只有一个 goroutine 可以更新 count 变量。
使用 sync.RWMutex 允许多个读 zvvq.cn
1 zvvq.cn
2 内容来自samhan666
3
4 copyright zvvq
5
copyright zvvq
6
7 内容来自zvvq
8
9 内容来自zvvq,别采集哟
10 内容来自zvvq,别采集哟
11
12 内容来自samhan
13 zvvq好,好zvvq
14 内容来自samhan
15 内容来自zvvq,别采集哟
16
zvvq好,好zvvq
17
18 本文来自zvvq
19 zvvq
20 zvvq好,好zvvq
21
zvvq好,好zvvq
22
23
24 内容来自samhan666
25
26
zvvq
27 内容来自zvvq
28
29 copyright zvvq
package main
import (
zvvq
"fmt"
"sync"
内容来自samhan
)
var m sync.RWMutex
var count int 内容来自samhan666
func read() { 本文来自zvvq
m.RLock()
defer m.RUnlock()
fmt.Println(count)
zvvq
} copyright zvvq
func write() {
zvvq好,好zvvq
m.Lock()
defer m.Unlock() 内容来自zvvq
count++ zvvq
} 内容来自samhan666
func main() { 内容来自samhan
go read() zvvq
go read() zvvq.cn
go write() 本文来自zvvq
fmt.Println(count) // 输出:1
本文来自zvvq
}
zvvq.cn
在示例中,我们使用读写锁 m,允许多个 goroutine 同时读取 count 变量,但只能有一个 goroutine 写入。
zvvq.cn
使用 sync.Cond 等待和通知
1
2
内容来自zvvq,别采集哟
3
4
copyright zvvq
5 内容来自zvvq,别采集哟
6
copyright zvvq
7 本文来自zvvq
8
内容来自zvvq
9
copyright zvvq
10
11
zvvq.cn
12
13
内容来自samhan666
14
内容来自samhan
15 本文来自zvvq
16
copyright zvvq
17 内容来自zvvq,别采集哟
18
19 copyright zvvq
20
21
22
23
24 内容来自zvvq
25
26
内容来自samhan666
27 zvvq.cn
28 本文来自zvvq
29
30
31
本文来自zvvq
32
package main 内容来自zvvq
import ( zvvq.cn
"fmt" zvvq.cn
"sync"
内容来自zvvq
"time"
内容来自samhan
)
zvvq.cn
var m sync.Mutex
copyright zvvq
var cond sync.Cond
var done bool zvvq.cn
func worker() { copyright zvvq
m.Lock() 本文来自zvvq
for !done { copyright zvvq
cond.Wait(&m)
copyright zvvq
}
m.Unlock() 内容来自zvvq,别采集哟
fmt.Println("Worker done")
} zvvq
func main() { 本文来自zvvq
go worker()
zvvq好,好zvvq
time.Sleep(time.Second)
内容来自zvvq,别采集哟
m.Lock() zvvq好,好zvvq
done = true
内容来自zvvq,别采集哟
cond.Signal() 本文来自zvvq
m.Unlock() 本文来自zvvq
fmt.Println("Main done")
} 内容来自zvvq
在示例中,我们使用条件变量 cond 等待 done 为 true,然后通知等待的 goroutine。
以上就是golang中的锁机制与同步技术的详细内容,更多请关注其它相关文章! 内容来自zvvq