美文网首页
golang 锁

golang 锁

作者: 蛐蛐儿阳 | 来源:发表于2020-05-05 21:47 被阅读0次

    手册中有点难懂,自己写个例子。

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        // 不想用time sleep
        // 挂起通道 不让主main退出,我想看结果
        //ch := make(chan bool)
    
        public := 1
    
    
        go func() {
            fmt.Println("执行了1操作")
            for i := 0; i < 2; i++ {
                time.Sleep(time.Microsecond * 100)
                public++
                fmt.Println(public)
            }
        }()
    
        go func() {
            fmt.Println("执行了2操作")
            for i := 0; i < 2; i++ {
                time.Sleep(time.Microsecond * 100)
                public--
                fmt.Println(public)
            }
        }()
    
        time.Sleep(time.Second * 2)
        println(public)
    }
    
    

    写完后发现没手册中的好理解, 输出

    执行了2操作
    执行了1操作
    2
    1
    2
    1
    1
    

    反正不管怎么执行,最后结果1不变, 但四次运算,输出顺序是乱的。
    我们加锁。

    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    func main() {
        // 不想用time sleep
        // 挂起通道 不让主main退出,我想看结果
        //ch := make(chan bool)
    
        // 记住声明方式
        var lock sync.Mutex
    
    
        public := 1
    
    
        go func() {
            lock.Lock()
            fmt.Println("执行了1操作")
            for i := 0; i < 2; i++ {
                time.Sleep(time.Microsecond * 100)
                public++
                fmt.Println(public)
            }
            lock.Unlock()
        }()
    
        go func() {
            lock.Lock()
            fmt.Println("执行了2操作")
            for i := 0; i < 2; i++ {
                time.Sleep(time.Microsecond * 100)
                public--
                fmt.Println(public)
            }
            lock.Unlock()
        }()
    
        time.Sleep(time.Second * 2)
        println(public)
    }
    

    注意这里锁是加了,但并不保证go1和go2哪个先开始。
    但,结果就好预测了, go1先开始,输出

    执行了1操作
    2
    3
    执行了2操作
    2
    1
    1
    

    go2先开始,输出

    执行了2操作
    0
    -1
    执行了1操作
    0
    1
    1
    

    就只有这两种可能。
    这里又学到一点知识。在主函数里添加

    public = public * 2
    

    他总是先*2,再执行,当然要放到sleep前面。

    相关文章

      网友评论

          本文标题:golang 锁

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