// 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)
}
}