golang学习笔记[3] 并发编程
发布时间:2020-12-16 18:47:46 所属栏目:大数据 来源:网络整理
导读:// one project main.gopackage mainimport ("fmt""runtime""sync")var counter int = 0func Count(lock *sync.Mutex) {//每次对counter操作前都需要加锁,每次使用完之后都要解锁。lock.Lock()counter++fmt.Println(counter)lock.Unlock()}func main() {//
// one project main.go package main import ( "fmt" "runtime" "sync" ) var counter int = 0 func Count(lock *sync.Mutex) { //每次对counter操作前都需要加锁,每次使用完之后都要解锁。 lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main() { //创建一个sync包下的Mutex结构体 lock := &sync.Mutex{} for i := 0; i < 10; i++ { go Count(lock) } for { lock.Lock() c := counter lock.Unlock() runtime.Gosched() if c > 0 { break } } }
不要通过共享内存来通信,而应该通过通信来共享内存。
使用channel来实现刚刚那个例子
package main import "fmt" func Count(ch chan int) { fmt.Println("Counting") ch <- 1 } func main() { chs := make([]chan int,10) for i := 0; i < 10; i++ { chs[i] = make(chan int) go Count(chs[i]) } for _,ch := range chs { <-ch } }
// one project main.go package main import ( "fmt" ) func main() { //channel声明 // var chanName chan elementType var ch chan int //一个map键为stringkey为bool类型的channel //var m map[string]chan bool //使用make定义一个channel //ch1 := make(chan int) /* 将一个数据写入(发送)带channel ch <- value 将一个数据从channel中读出 value := <- value */ //select语句 select { //如果chan1成功读到数据,则进行该case处理语句 case <-chan1: //如果成功向chan2写入数据,则进行该case处理语句 case chan2 <- 1: //如果上面都没有成功,则进入default处理流程 default: } ch2 := make(chan int) for { select { case ch <- 0: case ch <- 1: } i := <-ch2 fmt.Println("value",i) } //缓冲机制 //创建一个带缓冲的channel c := make(chan int,1024) //使用for range读取 for i := range c { fmt.Println(i) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |