Golang并发编程中的锁与同步原语-Golang

首页 2024-07-03 17:51:07

Go语言为管理并发提供了多种锁和同步原语:锁:sync.mutex(互斥锁)、sync.rwmutex(读写锁)同步原语:sync.waitgroup(等待任务完成)、sync.once(确保任务只执行一次)、sync.cond这些机制通过控制共享资源的访问,实现并发编程的安全性。实战案例展示了如何使用sync.mutex和sync.rwmutex实现并发安全计数器和并发读写队列。

Golang 并发编程中的锁与同步原语

引言
并发编程对于编写高效快速响应的应用程序至关重要。Go 该语言为管理和并发提供了一套丰富的锁和同步原语。本文将对此进行讨论 Go 语言中常用的锁和同步原语,并通过实战案例显示其用法。


锁是管理和访问共享资源的基本机制。Go 语言提供多种类型的锁:

立即学习“go语言免费学习笔记(深入);

  • sync.Mutex:一次只允许一个互斥锁 goroutine 访问受保护的资源。
  • sync.RWMutex:一种读写锁允许多个 goroutine 同时读取受保护的资源,但只允许一个 goroutine 写入。

使用锁
要使用锁,请先初始化:

var lock sync.Mutex

然后,使用 lock.Lock() 和 lock.Unlock() 管理对受保护资源的访问:

func <a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/16380.html" target="_blank">access</a>ProtectedResource() {
  lock.Lock()
  defer lock.Unlock()
  // 访问受保护的资源
}

同步原语
除锁外,Go 该语言还提供了其它用于同步并发操作的原语:

  • sync.WaitGroup:用于等待多个 goroutine 完成任务。
  • sync.Once:确保一个操作只执行一次。
  • sync.Cond:用于等待满足某些条件。

实战案例
并发计数器
我们使用 sync.Mutex 实现并发安全计数器:

import "sync"

type Counter struct {
  mu    sync.Mutex
  count int
}

func (c *Counter) Increment() {
  c.mu.Lock()
  defer c.mu.Unlock()
  c.count  
}

func (c *Counter) GetCount() int {
  c.mu.Lock()
  defer c.mu.Unlock()
  return c.count
}

并发读写队列
我们使用 sync.RWMutex 实现并发读写队列:

import "sync"

type Queue struct {
  mu    sync.RWMutex
  items []interface{}
}

func (q *Queue) Enqueue(item interface{}) {
  q.mu.Lock()
  defer q.mu.Unlock()
  q.items = append(q.items, item)
}

func (q *Queue) Dequeue() interface{} {
  q.mu.Lock()
  defer q.mu.Unlock()
  if len(q.items) > 0 {
    item := q.items[0]
    q.items = q.items[1:]
    return item
  }
  return nil
}

结论
(文章自然结尾没有总结话语)

以上是golang并发编程中锁与同步原语的详细内容,请关注其他相关文章!


p