Golang中的Race检测

由于golang中的go是非常方便的,加上函数又非常容易隐藏go。 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题。

所以在本质上说,goroutine的使用增加了函数的危险系数论go语言中goroutine的使用。比如一个全局变量,如果没有加上锁,我们写一个比较庞大的项目下来,就根本不知道这个变量是不是会引起多个goroutine竞争。

Rect主要做的就是检测线程间对某一个对象产生了竞争使用

// 未加锁版
package main

import (
    "fmt"
    "time"
)

type A struct {
    name string
}

func NewA() *A {
    a := new(A)
    return a
}

func main() {
    a := NewA()
    go func() {
        a.name = "www.nljb.net"
    }()
    a.name = "www.nljb.net"
    fmt.Println("a is ", a.name)

    time.Sleep(2 * time.Second)
}
// 未加锁版
go run -race a.go
a is  www.nljb.net
==================
WARNING: DATA RACE
Write at 0x00c04204e1c0 by goroutine 6:
  main.main.func1()
      C:/Users/a/Desktop/a.go:20 +0x3f

Previous write at 0x00c04204e1c0 by main goroutine:
  main.main()
      C:/Users/a/Desktop/a.go:22 +0x7a

Goroutine 6 (running) created at:
  main.main()
      C:/Users/a/Desktop/a.go:19 +0x6c
==================
Found 1 data race(s)
exit status 66
// 加锁版
package main

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

type A struct {
    name string
    lock *sync.RWMutex
}

func NewA() *A {
    a := new(A)
    a.lock = new(sync.RWMutex)
    return a
}

func (this *A) Set() {
    this.lock.Lock()
    this.name = "www.nljb.net"
    this.lock.Unlock()
}

func (this *A) Get() string {
    this.lock.Lock()
    name := this.name
    this.lock.Unlock()
    return name
}

func main() {
    a := NewA()
    go func() {
        a.Set()
    }()
    a.Set()
    fmt.Println("a is ", a.Get())

    time.Sleep(2 * time.Second)
}
// 加锁后进行竞争检测
go run -race a.go
a is  www.nljb.net

// 样例
package main

import(
    "time"
    "fmt"
)

func main() {
    a := 1
    go func(){
    a = 2
    }()
    a = 3
    fmt.Println("a is ", a)

    time.Sleep(2 * time.Second)
}
go run -race a.go
a is  3
==================
WARNING: DATA RACE
Write at 0x00c04205a058 by goroutine 6:
  main.main.func1()
      C:/Users/a/Desktop/a.go:11 +0x3f

Previous write at 0x00c04205a058 by main goroutine:
  main.main()
      C:/Users/a/Desktop/a.go:13 +0x8f

Goroutine 6 (running) created at:
  main.main()
      C:/Users/a/Desktop/a.go:10 +0x81
==================
Found 1 data race(s)
exit status 66

这个命令输出了Warning,告诉我们,goroutine5运行到第11行和main goroutine运行到13行的时候触发竞争了。 而且goroutine5是在第12行的时候产生的。


部分转自:http://www.cnblogs.com/yjf512/p/5144211.html 感谢