Go语言---线程安全

1.理解线程安全

 现在计算机体系中大部分都是多核计算机,都是包含有多个cpu.

当两个线程同时访问同一段内存,CPU的速度是比内存的速度快很多,在现在的CPU架构上,每个CPU都有自己的缓存机制,如同线程1和线程2 刚开始都去访问内存key = value1,cpu1和cpu2读内存只有第一次才会去访问内存,然后把数据存放在CPU缓存中,这就导致了,在某一时间点,CPU1修改了变量,但是CPU2没有缓存的变量还没变,导致变量不同步,会造成线程安全。

2.通过加锁解决线程问题

锁:是用来保护一个变量的访问,加锁后,只有一个线程可以读取数据,在未释放锁之前,其余线程是不能访问和操作这份数据的

  • go语言不仅仅提供基于CSP的通讯模型,也支持基于共享内存的多线程数据访问
  • Sync包提供了锁的基本原语
  • sync.Mutex互斥锁
    • Lock()加锁, Unlock() 解锁
  • sync.RWMutex 读写分离锁  (一定程度上提高了性能)
    • 不限制并发读取数据,只限制并发写操作和并发读写操作
  • sync.WaitGroup
    • 等待一组goroutine返回
    • func waitByWg() {
          wg := sync.WaitGroup{}
          wg.Add(delta:100)   //创建一百个线程
          for i := 0; i< 100; i++ {
              go func(i int ) {
                  fmt.Println(i)
                  wg.Done() //每一个线程执行完成后都需要done
              }(i)
          }
          wg.Wait() // 只有当一百个线程全部运行完成后才会退出
      }

  • sync.Once
    • 保证某段代码只执行一次
  • sync.Cond
    • 让一组goroutine在满足特定条件时被唤醒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道xn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值