golang 并发中全局惟一操做

package main

// go 携程共享 数据
// 加锁解锁操做
// 同步锁
import (
	"sync"
	"fmt"
)
// 建立Once结构
var once = sync.Once{}

func computed(data *int, lock *sync.Mutex) {
	once.Do(Echo) // 全局惟一操做
	lock.Lock()   // 加锁霸占数据
	*data++
	fmt.Println(*data)
	lock.Unlock() // 解锁让出数据
}
func Echo() {
	fmt.Println("全局惟一操做")
}

func main() {
	var data int = 0
	lock := &sync.Mutex{}
	for i := 0; i < 10; i++ { // 启动10个携程
		go computed(&data, lock) // 并发中只执行一次 Echo 函数 once.Do(Echo)全局惟一操做
	}

	for {
		lock.Lock()
		c := data
		lock.Unlock()
		if c >= 10 {
			fmt.Println("val=", data, "exit")
			break
		}
	}
}
相关文章
相关标签/搜索