package mainimport("fmt")func fibonacci(n int, ch chan int){a, b :=0,1for i :=0; i < n; i++{ch <- aa, b = b, a+b}close(ch)}func main(){ch :=make(chan int,6)go fibonacci(cap(ch), ch)for j := range ch {fmt.Println(j)}}
用 sync 实现并发
互斥锁
package mainimport("fmt""sync""time")func main(){var mutex sync.Mutexwait := sync.WaitGroup{}fmt.Println("Locked")mutex.Lock()for i :=1; i <=5; i++{wait.Add(1)go func(i int){fmt.Println("Not lock:", i)mutex.Lock()fmt.Println("Lock:", i)time.Sleep(time.Second)fmt.Println("Unlock:", i)mutex.Unlock()defer wait.Done()}(i)}time.Sleep(time.Second)fmt.Println("Unlocked")mutex.Unlock()wait.Wait()}
sync.Once 结构体
package mainimport("fmt""sync")func main(){var once sync.OnceonceBody :=func(){fmt.Println("test only once,这里只打印一次!")//打印}done :=make(chan bool)for i :=0; i <6; i++{go func(){once.Do(onceBody)//确保只背执行一次done <-true}()}for i :=0; i <6; i++{<-done}}
同步等待组 zync.WaitGroup
package mainimport("fmt""sync""time")func main(){var wg sync.WaitGroupwg.Add(1)go func(){defer wg.Done()fmt.Println("1 goroutine sleep ...")time.Sleep(2)fmt.Println("1 goroutine exit ...")}()wg.Add(1)go func(){defer wg.Done()fmt.Println("2 goroutine sleep ...")time.Sleep(4)fmt.Println("2 goroutine exit ...")}()fmt.Println("Waiting for all goroutine ")wg.Wait()fmt.Println("All goroutines finished!")}
package mainimport("fmt""sync""time")func main(){testFunc :=func(wg *sync.WaitGroup, id int){defer wg.Done()fmt.Printf("%v goroutine start ...\n", id)time.Sleep(2)fmt.Printf("%v goroutine exit ...\n", id)}var wg sync.WaitGroupconst N =3wg.Add(N)for i :=0; i < N; i++{go testFunc(&wg, i)}fmt.Println("Waiting for all goroutine")wg.Wait()fmt.Println("All goroutines finished!")}
竞态检测器
go run/build/test -race main.go
模拟非法竞态访问数据
package mainimport"fmt"func main(){c :=make(chan bool)m :=make(map[string]string)go func(){m["a"]="one"// 第一个冲突访问.c <-true}()m["b"]="two"// 第一个冲突访问<-cfor k, v := range m {fmt.Println(k, v)}}
应用
自增整数生成器
package mainimport"fmt"// 生成自增的整数
func IntegerGenerator() chan int{var ch chan int=make(chan int)// 开启 goroutinego func(){for i :=0;; i++{ch <- i // 直到通道索要数据,才把i添加进信道}}()return ch
}func main(){generator :=IntegerGenerator()for i :=0; i <100; i++{//生成100个自增的整数fmt.Println(<-generator)}}
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,广泛用于构建互联网应用。在Java中,我们经常需要发送HTTP请求来与远程服务器进行通信。本文将详细介绍Java中HTTP请求消息的各个部分,包括请求行、…
Ableton Live 11 mac是一款数字音频工作站软件,用于音乐制作、录音、混音和现场演出。它由Ableton公司开发,是一款极其流行的音乐制作软件之一。 Ableton Live 11 mac软件特点和功能
Comping功能:Live 11增加了Comping功能,允许用…