首页  

GO 并发递增计数实例     所属分类 go 浏览量 854
两个版本 加锁和不加锁

不加锁的版本
count1.go 

package main

import "fmt"
import "sync"


var count int
var NUM = 1000000
var GONUM = 100
var wg sync.WaitGroup

func main() {
   wg.Add(GONUM)
   for i := 0; i < GONUM; i++ {
      go countadd()
   }
   wg.Wait()
   fmt.Println(count)
}
func countadd(){
   defer wg.Done()
   for i := 0; i < NUM; i++ {
      count++;
   }
}


加锁的版本 count2.go package main import "fmt" import "sync" var count int var NUM = 1000000 var GONUM = 100 var wg sync.WaitGroup var lock sync.Mutex func main() { wg.Add(GONUM) for i := 0; i < GONUM; i++ { go countadd() } wg.Wait() fmt.Println(count) } func countadd(){ defer wg.Done() lock.Lock() defer lock.Unlock() for i := 0; i < NUM; i++ { count++; } }
输出结果 go run count1.go 31019733 go run count1.go 30088065 go run count2.go 100000000 go run count2.go 100000000
完整代码 https://gitee.com/dyyx/hellocode/blob/master/web/tech/go/demo/count1.go https://gitee.com/dyyx/hellocode/blob/master/web/tech/go/demo/count2.go

上一篇     下一篇
go select 与 定时器

go类型转换和断言

学习GO要了解的几个特性

Go并发构建模块

Go语言atomic原子操作

GO mutex 与 atomic 性能对比