golang channel 多协程问题示例

package main

import (
	"fmt"
	"time"
)

// 使用channel一样要遵守一些约定。
// 一个约定就是将内存的所有权交出去后,无论是通过内存指针,还是消息控制,就不能再操作这块内存。否则一样会引入多线程问题
func main() {

	output := make(chan []int)
	stop := make(chan struct{})

	go func() {
		arr := []int{1, 2, 3}
		output <- arr

		time.Sleep(time.Second * 2)

		arr[1] = 5 // 2秒后赋值为 5
		stop <- struct{}{}
	}()

	outArr := <-output  // 立即执行输出,如果没有延迟,应是输出原始值
	fmt.Printf("%v\n", outArr)

	outArr[1] = 10 // 立即输出赋值为10的操作
	fmt.Printf("%v\n", outArr)
	//对于主线程而言,将outArr[1]设置为10后,两次读的结果不同,数据被破坏。

	time.Sleep(time.Second * 2)   // 2秒后再执行这个输出。
	fmt.Printf("%v\n", outArr)

	<-stop
}

输出:

[1 2 3]
[1 10 3]
[1 10 3]
 

 

你可能感兴趣的:(Golang)