码迷,mamicode.com
首页 > 其他好文 > 详细

golang锁

时间:2018-10-21 19:39:50      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:nbsp   分享图片   wait   group   技术分享   inf   src   运行   var   

 

 

 

 

 

package main

import (
	"fmt"
)

func main() {
	var a = 1

	go func(num *int) {
		for n := 0; n < 1000; n++ {
			*num++
		}
	}(&a)

	go func(num1 *int) {
		for i := 0; i < 1000; i++ {
			*num1++
		}
	}(&a)

	fmt.Println(a)
}

发现执行结果输出为1,原因为主进程在创建完子线程后就结束了。子线程还未执行。也就没有对变量a进程运算

技术分享图片

 使用sync.WaitGroup等待子线程结束后退出。

package main

import (
	"fmt"
	"sync"
)

func main() {
	var a int
	var wg sync.WaitGroup
	wg.Add(2)
	go func(num *int) {
		for n := 0; n < 100000; n++ {
			*num++
		}
		wg.Done()
	}(&a)

	go func(num1 *int) {
		for i := 0; i < 100000; i++ {
			*num1++

		}
		wg.Done()
	}(&a)
	wg.Wait()
	fmt.Println(a)
}

技术分享图片

技术分享图片

技术分享图片

技术分享图片

在运行多次后发现并不等于200000,而且每次都不同,原因为线程1在操作a变量时变量为0,运算的1,在运算过程中,线程b也读取a变量此时a还为1,也就造就了运算结果不一致问题。

 

此时就需要使用锁,sync.Mutex

package main

import (
	"fmt"
	"sync"
)

func main() {
	var a int
	var wg sync.WaitGroup
	var lock sync.Mutex
	wg.Add(2)
	go func(num *int) {
		for n := 0; n < 100000; n++ {
			lock.Lock()
			*num++
			lock.Unlock()
		}
		wg.Done()
	}(&a)

	go func(num1 *int) {
		for i := 0; i < 100000; i++ {
			lock.Lock()
			*num1++
			lock.Unlock()
		}
		wg.Done()
	}(&a)
	wg.Wait()
	fmt.Println(a)
}

执行多次后结果都是唯一的。

技术分享图片

技术分享图片

 

golang锁

标签:nbsp   分享图片   wait   group   技术分享   inf   src   运行   var   

原文地址:https://www.cnblogs.com/LC161616/p/9826076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!