GO语言中这段加锁代码,为什么两个函数执行结果不一样?

深海玩命 发布于 2017/03/06 14:27
阅读 268
收藏 0
Go

// wer project main.go
package main

import (
    "fmt"
    "sync"
    "time"
)

var cccc int
var m *sync.Mutex

func Count(i int) {
    for j := 0; j < 10000000; j++ {
        m.Lock() //位置1
        cccc = cccc + 1
        m.Unlock()
    }
}
func Count1(i int) {
    m.Lock()//位置2
    for j := 0; j < 10000000; j++ {
        cccc = cccc + 1
    }
    m.Unlock()
}
func main() {
    m = new(sync.Mutex)
    for i := 0; i < 15; i++ {
        go Count1(i) //  go Coun1(i) 这两个函数加锁的位置不在同一地方,哪个位置是正确的?
    }
    time.Sleep(10 * time.Second)
    fmt.Println(cccc)
}

加载中
0
偃鼠饮河
偃鼠饮河

不是结果不一样,是一个效率太低,没执行完。

0
♂茶舞
♂茶舞

不是原子操作

0
庄津津
庄津津

time.Sleep() 1分钟或者更长,你会发现两个函数执行结果一样。Count1()其实跟顺序执行效果是一样的。

返回顶部
顶部