zvvq技术分享网

golang中的锁机制与同步技术(go语言channel)

作者:zvvq博客网
导读go 语言中的锁机制和同步技术对于实现并发性至关重要。常用的锁机制包括:sync.mutex:互斥锁,一次只允许一个 goroutine 访问临界区。sync.rwmutex:读写锁,允许多个 goroutine 同时读,但

go 语言中的锁机制和同步技术对于实现并发性至关重要。常用的锁机制包括:sync.mutex:互斥锁,一次只允许一个 goroutine 访问临界区。sync.rwmutex:读写锁,允许多个 goroutine 同时读,但一次只能有一个 goroutine 写。sync.cond:条件变量,用于等待或通知其他 goroutine。 内容来自samhan666

copyright zvvq

Go 语言中的锁机制与同步技术

内容来自zvvq

在 Go 语言中,锁和同步原语对于实现并发性和防止竞争至关重要。本文将探索 Go 语言提供的不同锁机制和同步技术,并提供实际示例说明其用法。 内容来自zvvq

锁机制

copyright zvvq

”;

内容来自samhan

Go 语言中常用的锁机制有: 内容来自zvvq

sync.Mutex: 互斥锁,一次只允许一个 goroutine 访问临界区。 sync.RWMutex: 读写锁,允许多个 goroutine 同时读,但一次只能有一个 goroutine 写。 sync.Cond: 条件变量,用于等待或通知其他 goroutine。

实战示例 zvvq

使用 sync.Mutex 保护临界区

内容来自samhan666

1

本文来自zvvq

2 zvvq

3 zvvq好,好zvvq

4 内容来自zvvq,别采集哟

5

zvvq.cn

6

内容来自zvvq,别采集哟

7

zvvq

8 zvvq.cn

9 内容来自samhan666

10

zvvq.cn

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

zvvq.cn

package main 内容来自zvvq,别采集哟

import (

zvvq好,好zvvq

"fmt"

zvvq好,好zvvq

"sync" zvvq

)

本文来自zvvq

var m sync.Mutex

内容来自zvvq

var count int 本文来自zvvq

func increment() { zvvq.cn

m.Lock() zvvq好,好zvvq

defer m.Unlock()

内容来自zvvq

count++

内容来自zvvq,别采集哟

}

内容来自samhan666

func main() { copyright zvvq

go increment() 内容来自zvvq,别采集哟

go increment() 内容来自samhan

go increment() 内容来自zvvq

fmt.Println(count) // 输出:3 内容来自samhan666

} 内容来自zvvq

在示例中,我们使用互斥锁 m 保护临界区,确保每次只有一个 goroutine 可以更新 count 变量。

copyright zvvq

使用 sync.RWMutex 允许多个读 zvvq.cn

1 zvvq.cn

2 内容来自samhan666

3

内容来自zvvq,别采集哟

4 copyright zvvq

5

copyright zvvq

6

内容来自samhan666

7 内容来自zvvq

8

内容来自zvvq

9 内容来自zvvq,别采集哟

10 内容来自zvvq,别采集哟

11

zvvq

12 内容来自samhan

13 zvvq好,好zvvq

14 内容来自samhan

15 内容来自zvvq,别采集哟

16

zvvq好,好zvvq

17

本文来自zvvq

18 本文来自zvvq

19 zvvq

20 zvvq好,好zvvq

21

zvvq好,好zvvq

22

zvvq好,好zvvq

23

内容来自zvvq

24 内容来自samhan666

25

zvvq好,好zvvq

26

zvvq

27 内容来自zvvq

28

内容来自zvvq

29 copyright zvvq

package main

copyright zvvq

import (

zvvq

"fmt"

内容来自samhan666

"sync"

内容来自samhan

)

zvvq

var m sync.RWMutex

copyright zvvq

var count int 内容来自samhan666

func read() { 本文来自zvvq

m.RLock()

内容来自zvvq,别采集哟

defer m.RUnlock()

内容来自zvvq

fmt.Println(count)

zvvq

} copyright zvvq

func write() {

zvvq好,好zvvq

m.Lock()

内容来自samhan

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 等待和通知

zvvq.cn

1

内容来自zvvq,别采集哟

2

内容来自zvvq,别采集哟

3

内容来自samhan

4

copyright zvvq

5 内容来自zvvq,别采集哟

6

copyright zvvq

7 本文来自zvvq

8

内容来自zvvq

9

copyright zvvq

10

本文来自zvvq

11

zvvq.cn

12

内容来自zvvq

13

内容来自samhan666

14

内容来自samhan

15 本文来自zvvq

16

copyright zvvq

17 内容来自zvvq,别采集哟

18

内容来自samhan

19 copyright zvvq

20

内容来自zvvq,别采集哟

21

zvvq.cn

22

zvvq

23

copyright zvvq

24 内容来自zvvq

25

本文来自zvvq

26

内容来自samhan666

27 zvvq.cn

28 本文来自zvvq

29

zvvq.cn

30

zvvq.cn

31

本文来自zvvq

32

copyright zvvq

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

zvvq

var done bool zvvq.cn

func worker() { copyright zvvq

m.Lock() 本文来自zvvq

for !done { copyright zvvq

cond.Wait(&m)

copyright zvvq

}

内容来自samhan666

m.Unlock() 内容来自zvvq,别采集哟

fmt.Println("Worker done")

内容来自samhan

} 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

} 内容来自zvvq

在示例中,我们使用条件变量 cond 等待 done 为 true,然后通知等待的 goroutine。

内容来自zvvq

以上就是golang中的锁机制与同步技术的详细内容,更多请关注其它相关文章! 内容来自zvvq