轻松检测Golang并发的数据竞争

栏目: Go · 发布时间: 6年前

内容简介:Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没有一种机制可以检测代码中的数据竞争呢?数据竞争是并发情况下,存在多线程/协程读写相同数据的情况,必须存在至少一方写。另外,全是读的情况下是不存在数据竞争的。

Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没有一种机制可以检测代码中的数据竞争呢?

数据竞争是并发情况下,存在多线程/协程读写相同数据的情况,必须存在至少一方写。另外,全是读的情况下是不存在数据竞争的。

使用race检测数据竞争

go build 有个标记 race 可以帮助检测代码中的数据竞争。

  awesome git:(master)  go help build
//.... omit
-race
        enable data race detection.
        Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.

下面举个栗子:

package main

import "fmt"

func main() {
    i := 0

    go func() {
        i++ // write i
    }()

    fmt.Println(i) // read i
}

测试方法:

  awesome git:(master)  go build -race hi.go
  awesome git:(master)  ./hi
0
==================
WARNING: DATA RACE
Write at 0x00c00009c008 by goroutine 6:
  main.main.func1()
      /Users/mac/go/src/github.com/mac/awesome/hi.go:9 +0x4e

Previous read at 0x00c00009c008 by main goroutine:
  main.main()
      /Users/mac/go/src/github.com/mac/awesome/hi.go:12 +0x88

Goroutine 6 (running) created at:
  main.main()
      /Users/mac/go/src/github.com/mac/awesome/hi.go:8 +0x7a
==================
Found 1 data race(s)
exit status 66

提示示例代码存在1处数据竞争,说明了数据会在第9行写,并且同时会在12行读形成了数据竞争。

当然你也可以使用 go run 一步到位:

  awesome git:(master)  go run -race hi.go
0
==================
WARNING: DATA RACE
Write at 0x00c000094008 by goroutine 6:
  main.main.func1()
      /Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go:9 +0x4e

Previous read at 0x00c000094008 by main goroutine:
  main.main()
      /Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go:12 +0x88

Goroutine 6 (running) created at:
  main.main()
      /Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go:8 +0x7a
==================
Found 1 data race(s)
exit status 66

如果这篇文章对你有帮助,请点个赞/喜欢,让我知道我的写作是有价值的,感谢。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java程序员修炼之道

Java程序员修炼之道

[英] Benjamin J. Evans、[荷兰] Martijn Verburg / 吴海星 / 人民邮电出版社 / 2013-7 / 89.00元

本书分为四部分,第一部分全面介绍Java 7 的新特性,第二部分探讨Java 关键编程知识和技术,第三部分讨论JVM 上的新语言和多语言编程,第四部分将平台和多语言编程知识付诸实践。从介绍Java 7 的新特性入手,本书涵盖了Java 开发中最重要的技术,比如依赖注入、测试驱动的开发和持续集成,探索了JVM 上的非Java 语言,并详细讲解了多语言项目, 特别是涉及Groovy、Scala 和Cl......一起来看看 《Java程序员修炼之道》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器