Go 多线程 (2) sync.Mutex

线程不安全的版本

package main

 
import (

    "fmt"

    "runtime"

    "sync"

)

 
var (

    count int32

    wg sync.WaitGroup

)

 
func main() {

    wg.Add(2)

    go addValue()

    go addValue()

    wg.Wait()

    fmt.Println(count)

}

 
func addValue() {

    defer wg.Done()

    for i := 0; i < 2; i++ {

        value := count

        runtime.Gosched()

        value++

        count = value

    }

}

线程安全的版本

package main

 

import (

    "fmt"

    "runtime"

    "sync"

)

 

var (

    count int32

    wg sync.WaitGroup

    mutex sync.Mutex

)

 

func main() {

    wg.Add(2)

    go addValue()

    go addValue()

    wg.Wait()

    fmt.Println(count)

}

 

func addValue() {

    defer wg.Done()

    for i := 0; i < 2; i++ {

        mutex.Lock()

        value := count

        runtime.Gosched()

        value++

        count = value

        mutex.Unlock()

    }

}

使用atomic

package main

 

import (

    "fmt"

    "sync"

    "sync/atomic"

)

 

var (

    count int32

    wg sync.WaitGroup

    mutex sync.Mutex

)

 

func main() {

    wg.Add(2)

    go addValue()

    go addValue()

    wg.Wait()

    fmt.Println(count)

}

 

func addValue() {

    defer wg.Done()

    for i := 0; i < 200; i++ {

        atomic.AddInt32(&count, 1)

        //runtime.Gosched()

    }

}