美文网首页go并发编程
Go并发编程之美-互斥锁

Go并发编程之美-互斥锁

作者: 阿里加多 | 来源:发表于2019-02-12 13:34 被阅读27次

    一、前言

    go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于通道的同步措施。本节我们先来看看go中互斥锁

    二、互斥锁

    互斥锁是独占锁,同时只有一个线程可以获取该锁,其他线程则会被阻塞挂起,等获取锁的线程释放锁后,阻塞的线程中的一个才可以被唤醒并获取锁。

    本节我们使用独占锁来实现一个线程安全的计数器:

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    var (
        counter int//计数器
        wg      sync.WaitGroup//信号量
        mutex   sync.Mutex//互斥锁
    )
    
    func main() {
        //1.两个信号量
        wg.Add(2)
    
        //2.开启两个线程
        go incCounter()
        go incCounter()
    
        //3.等待子线程结束
        wg.Wait()
        fmt.Println(counter)
    }
    
    func incCounter() {
        defer wg.Done()
    
        //2.1.获取锁
        mutex.Lock()
    
        //2.2.计数加1
        counter++
        
        //2.3.释放独占锁
        mutex.Unlock()
    }
    
    
    • 在go中使用 sync.Mutex 就可以获取一个开箱即用的互斥锁
    • counter是一个变量,这里用来存放计数
    • wg用来实现主线程等待子线程执行完毕,代码(2)设置信号为2,因为本例子里面开启了两个字线程
    • 代码(2)开启了两个子线程,线程内首先获取互斥锁,然后累加计数,然后释放锁,最后递减信号量
    • 代码(3)等待子线程执行完毕后返回,然后打印计数

    三、总结

    go中互斥锁是独占锁,并且是不可重入锁,同一个线程并不可获取同一个锁多次。

    相关文章

      网友评论

        本文标题:Go并发编程之美-互斥锁

        本文链接:https://www.haomeiwen.com/subject/biuheqtx.html