首页 > 其他 > 详细

golang锁

时间:2018-10-21 18:45:25      阅读:132      评论:0      收藏:0      [点我收藏+]

 

 

 

 

 

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锁

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!