• GO语言-锁操作


    概述

    sync包文档:Package sync - The Go Programming Language

    sync包提供了基本同步的操作,如互斥锁等。除了Once和 WaitGroup之外,大多数类型都是提供低级库例程使用的。而更高级的的同步最好是通过channel和通信来完成。

    互斥锁 Mutex

    互斥锁比较暴力,当一个goroutine获得了互斥锁之后,其他的goroutine只能等待释放锁。

    使用互斥锁时,对资源操作完一定要解锁,否则程序会死锁。建议使用defer语句来解锁。

    1. //定义互斥锁对象
    2. var mutex_name sync.Mutex
    3. //上锁
    4. mutex_name.Lock()
    5. //解锁
    6. mutex_name.Unlock()

    同样是的火车站售票问题,我们看一下通过互斥锁解决临界资源问题的效果

    1. //车票余量
    2. var tickets = 5
    3. //定义同步等待组
    4. var wg sync.WaitGroup
    5. //定义互斥锁对象
    6. var mutex sync.Mutex
    7. func main() {
    8. wg.Add(3)
    9. go saleTickets("1号售票口")
    10. go saleTickets("2号售票口")
    11. go saleTickets("3号售票口")
    12. wg.Wait()
    13. }
    14. func saleTickets(name string) {
    15. for {
    16. mutex.Lock()
    17. if tickets > 0 {
    18. fmt.Printf("车票剩余:%v, %v售出\n", tickets, name)
    19. tickets--
    20. time.Sleep(1 * time.Second)
    21. } else {
    22. mutex.Unlock()
    23. fmt.Println("车票已售罄...")
    24. wg.Done()
    25. break
    26. }
    27. mutex.Unlock()
    28. }
    29. }

     

    读写锁 RWMutex

    读写锁和普通的互斥锁不同的是,它是一种专门针对读操作和写操作的互斥锁。

    读写锁同一时刻允许有多个读操作在进行,但在同一时刻只允许有一个写操作在进行。并且在某一个写操作进行过程中,读操作也是不可以进行的。所以说,读写锁对于读操作可以同时并发,但是对于写操作是完全互斥的。

    1. //定义读写锁锁对象
    2. var rwmutex_name sync.RWMutex
    3. //读锁
    4. rwmutex_name.RLock
    5. //读解锁
    6. rwmutex_name.RUnlock
    7. //写锁
    8. rwmutex_name.Lock
    9. //写解锁
    10. rwmutex_name.Unlock

    读写锁我们就不进行示例的展示了,因为和上面互斥锁展示的示例效果应该差别不大。

            对写锁实际解决的问题是,使用互斥锁带来并发能力降低的问题。因为互斥锁不论读操作还是写操作都会阻塞,程序从并发变成了串行。

            而实际上对于不会对临界资源产生修改的读操作,我们是不需要阻塞的;只有对临界资源需要修改的写操作,我们才需要阻塞。所以读写锁就是为了提高程序加锁时的并发能力。

  • 相关阅读:
    【Leetcode刷题Python】密码校验
    linux开发工具的使用
    【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词
    前后端分离跨域问题解决方案
    快讯 | ALVA 荣获首届“格物杯”联通物联网应用创新大赛复赛一等奖!
    聚观早报 | 遥感AI大模型发布;拼多多启动11.11大促
    鸿蒙HarmonyOS应用开发者(基础+高级)认证
    【并发】J.U.C线程池
    最新版本 Stable Diffusion 开源 AI 绘画工具之图生图进阶篇
    BGP选路的十一条原则(第八课)
  • 原文地址:https://blog.csdn.net/qq522044637/article/details/125447239