golang mutex用法

golang mutex用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import (
	"fmt"
	"sync"
)

var (
	counter int
	mutex   sync.Mutex
)

func incrementCounter() {
	mutex.Lock()         // 获取互斥锁
	defer mutex.Unlock() // 在函数返回时释放互斥锁
	counter++            // 访问共享资源
}

func main() {
	wg := sync.WaitGroup{}
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			incrementCounter()
			wg.Done()
		}()
	}
	wg.Wait()

	fmt.Println("Counter:", counter)
}

在上面的示例中,

  • 首先定义了一个全局变量counter和一个互斥锁mutex。

  • 然后编写了一个incrementCounter函数,该函数对counter进行递增操作。

  • 在主函数main中,启动了1000个goroutine并发地调用incrementCounter函数来增加counter的值。

  • 通过使用互斥锁,确保了对counter的安全访问,避免了竞争条件的发生。

  • 需要注意的是,在使用互斥锁时,需要在临界区的开始处调用Lock方法获取锁,并在临界区结束时调用Unlock方法释放锁。

  • 为了确保锁一定会被释放,可以使用defer语句来延迟执行Unlock方法。