TypechoJoeTheme

Dcr163的博客

统计

golang里的互斥锁使用

2021-11-28
/
0 评论
/
1,045 阅读
/
正在检测是否收录...
11/28

golang里的互斥锁使用

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup
var lock sync.Mutex

var run int = 0

func main() {
    //未加锁,造成读写混乱
    //wg.Add(3)
    //go addNum()
    //go addNum()
    //go addNum()
    //wg.Wait()
    //fmt.Println(run) //这里不是我们预期的结果3000,随机的

    //加上互斥锁,解决读写混乱;将并发变成了串行,牺牲效率,保证数据安全性。
    wg.Add(3)
    go addRun("a1")
    go addRun("a2")
    go addRun("a3")
    wg.Wait()
    fmt.Println(run)    //4500
}

//这个函数如果同时并发一起调用,结果会存在数据竞争,导致最后的结果与期待的不符
func addNum() {
    for i := 0; i < 1000; i++ {
        run++
    }
    wg.Done()
}
//使用 sync.Mutex 使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,多个goroutine同时等待一个锁时,唤醒的策略是随机的。
func addRun(typeName string) {
    fmt.Println(typeName)
    lock.Lock()        //加锁
    for i := 0; i < 1500; i++ {
        run++
    }
    lock.Unlock()    //释放
    wg.Done()
}
go
朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

https://dcr163.cn/592.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. William Tardent
    2024-02-27
  2. Maryann Hamer
    2024-02-27
  3. Sanora Pantano
    2024-02-24
  4. aa
    2024-02-21
  5. Kassie Baum
    2024-01-28

标签云