zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Go-标准库-sync(一)

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 变量和一个互斥锁 mutexincrement() 函数用于对 count 进行加一操作,并且在操作完成后立即释放互斥锁,避免锁被一直占用而导致其它 goroutine 无法进入临界区。在 main() 函数中,我们启动了 1000 个 goroutine 并发地执行 increment() 函数,最终输出 count 的值。由于互斥锁的保护,程序的输出结果总是 1000。