并发是同时发生多个计算或事件的能力。并发通常通过同时执行多个任务或进程来实现,这些任务或进程共享相同的资源(例如内存或处理器)。并发使用的基本机制被称为锁。在Go语言中,锁是一个类型变量,它包含一个内部计数器,用于跟踪已获取的锁的数量。当一个goroutine获取一个锁时,它会将计数器增加一;当一个goroutine释放一个锁时,它会将计数器减少一。
Go语言中提供了五种类型的锁:互斥锁(mutex)、读写锁(RWMutex)、等待组(WaitGroup)、一次性锁(Once)和条件变量(Cond)。
package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个互斥锁
var mutex sync.Mutex
// 使用互斥锁保护共享资源
mutex.Lock()
fmt.Println("Only one goroutine can access the shared resource at a time.")
mutex.Unlock()
}
package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个读写锁
var rwmutex sync.RWMutex
// 使用读写锁保护共享资源
rwmutex.RLock()
fmt.Println("Multiple goroutines can read the shared resource at the same time.")
rwmutex.RUnlock()
// 使用写锁保护共享资源
rwmutex.Lock()
fmt.Println("Only one goroutine can write to the shared resource at a time.")
rwmutex.Unlock()
}
package main
import (
"sync"
"fmt"
)
var wg sync.WaitGroup
func main() {
// 创建10个goroutine来并发地执行任务
for i := 0; i < 10; i++ {
wg.Add(1) // 告诉等待组有1个goroutine需要等待
go func() {
// 执行任务
fmt.Println("Hello, world!")
wg.Done() // 告诉等待组当前goroutine已完成
}()
}
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All goroutines have finished.")
}
package main
import (
"sync"
"fmt"
)
var once sync.Once
func main() {
// 只执行一次init函数
once.Do(func() {
fmt.Println("Hello, world!")
})
}
package main
import (
"sync"
"fmt"
"time"
)
var cond = sync.NewCond(&sync.Mutex{})
var count int
func main() {
go func() {
// 等待count大于0
cond.L.Lock()
for count <= 0 {
cond.Wait()
}
cond.L.Unlock()
fmt.Println("Count is greater than 0.")
}()
// 将count设置为1,并通知等待的goroutine
time.Sleep(1 * time.Second)
cond.L.Lock()
count = 1
cond.Signal()
cond.L.Unlock()
}
?